blob: 7fd4a7186b2a7b957549050ccaa07ee8a025ea5f [file] [log] [blame]
#!/bin/ksh
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# Upgrade a machine from a cpio archive area in about 5 minutes.
# By Roger Faulkner and Jeff Bonwick, April 1993.
# (bfu == Bonwick/Faulkner Upgrade, a.k.a. Blindingly Fast Upgrade)
#
# Usage: bfu [-f] <archive_dir> [root-dir] # for normal machines
# bfu -c [-f] <archive_dir> <exec-dir> # for diskless clients
#
# The -f flag is to override the built-in safety check which requires
# that the starting-point OS be a least a certain revision.
#
# You have to be super-user. It's safest to run this from the
# system console, although I've run it under OW and even via
# remote login with no problems.
#
# You will have to reboot the system when the upgrade is complete.
#
# You should add any administrative files you care about to this list.
# Warning: there had better be no leading '/' on any of these filenames.
#
# The CDPATH variable causes ksh's `cd' builtin to emit messages to stdout
# under certain circumstances, which can really screw things up; unset it.
#
unset CDPATH
export LC_ALL="C"
if [ -z "$GATEPATH" ]; then
GATEPATH=/ws/onnv-gate
test -d $GATEPATH || GATEPATH=/net/onnv.eng/export/onnv-gate
fi
export GATE=${GATEPATH}
export ARCHIVE=${ARCHIVEPATH:-${GATEPATH}}
#
# NOTE: Entries in *_files must expand to either the exact files required,
# or to directories that will be scoured for files. Any directories
# (and subdirectories) resulting from a wildcard expansion will be
# fully recursed by BFU's searching for files. (E.g. /etc/inet/* will
# include all files in any of its directories, as well as any files in
# /etc/inet/ itself.
#
# These lists should really be generated automatically from the
# pkgmap(4) metadata.
#
#
# First list: files to be saved in global and non-global zones.
#
all_zones_files="
etc/.login
etc/acct/holidays
etc/auto_*
etc/cron.d/at.deny
etc/cron.d/cron.deny
etc/crypto/pkcs11.conf
etc/default/*
etc/dev/reserved_devnames
etc/dfs/dfstab
etc/dumpdates
etc/ftpd/*
etc/ftpusers
etc/group
etc/gss/gsscred.conf
etc/gss/mech
etc/gss/qop
etc/inet/*
etc/init.d/*
etc/inittab
etc/ipf/ipf.conf
etc/iu.ap
etc/krb5/kadm5.acl
etc/krb5/kdc.conf
etc/krb5/kpropd.acl
etc/krb5/krb5.conf
etc/krb5/warn.conf
etc/ksh.kshrc
etc/logadm.conf
etc/logindevperm
etc/lp/Systems
etc/mail/*.cf
etc/mail/*.hf
etc/mail/*.rc
etc/mail/aliases
etc/mail/helpfile
etc/mail/local-host-names
etc/mail/trusted-users
etc/named.conf
etc/net/*/services
etc/netconfig
etc/nfs/nfslog.conf
etc/nfssec.conf
etc/nscd.conf
etc/nsswitch.*
etc/pam.conf
etc/passwd
etc/policy.conf
etc/printers.conf
etc/profile
etc/project
etc/publickey
etc/remote
etc/resolv.conf
etc/rmmount.conf
etc/rpc
etc/rpld.conf
etc/saf/_sactab
etc/saf/_sysconfig
etc/saf/zsmon/_pmtab
etc/security/audit_class
etc/security/audit_control
etc/security/audit_event
etc/security/audit_startup
etc/security/audit_user
etc/security/audit_warn
etc/security/auth_attr
etc/security/crypt.conf
etc/security/exec_attr
etc/security/policy.conf
etc/security/prof_attr
etc/sfw/openssl/openssl.cnf
etc/shadow
etc/skel/.profile
etc/skel/local.*
etc/smartcard/.keys
etc/smartcard/desktop.properties
etc/smartcard/ocf.classpath
etc/smartcard/opencard.properties
etc/ssh/ssh_config
etc/ssh/sshd_config
etc/syslog.conf
etc/ttydefs
etc/ttysrch
etc/user_attr
etc/uucp/[A-Z]*
etc/vfstab
var/smb/*
var/spool/cron/crontabs/*
var/yp/Makefile
var/yp/aliases
var/yp/nicknames
"
#
# Second list: files to be saved in the global zone only.
#
global_zone_only_files="
boot/grub/menu.lst
boot/solaris/bootenv.rc
boot/solaris/devicedb/master
boot/solaris/filelist.ramdisk
etc/aggregation.conf
etc/bootrc
etc/crypto/kcf.conf
etc/devlink.tab
etc/dladm/*
etc/driver_aliases
etc/driver_classes
etc/lvm/devpath
etc/lvm/lock
etc/lvm/md.cf
etc/lvm/md.ctlrmap
etc/lvm/md.tab
etc/lvm/mddb.cf
etc/lvm/runtime.cf
etc/mach
etc/minor_perm
etc/name_to_major
etc/name_to_sysnum
etc/nca/nca.if
etc/nca/ncakmod.conf
etc/nca/ncalogd.conf
etc/nca/ncaport.conf
etc/openwin/server/etc/OWconfig
etc/path_to_inst
etc/power.conf
etc/ppp/chap-secrets
etc/ppp/options
etc/ppp/pap-secrets
etc/security/device_policy
etc/security/extra_privs
etc/security/tsol/devalloc_defaults
etc/security/tsol/label_encodings
etc/security/tsol/relabel
etc/security/tsol/tnrhdb
etc/security/tsol/tnrhtp
etc/security/tsol/tnzonecfg
etc/system
etc/zones/index
kernel/drv/aac.conf
kernel/drv/elxl.conf
kernel/drv/emlxs.conf
kernel/drv/fp.conf
kernel/drv/iscsi.conf
kernel/drv/md.conf
kernel/drv/mpt.conf
kernel/drv/options.conf
kernel/drv/qlc.conf
kernel/drv/ra.conf
kernel/drv/scsa2usb.conf
kernel/drv/scsi_vhci.conf
kernel/drv/sd.conf
kernel/drv/ssd.conf
platform/*/kernel/drv/*ppm.conf
platform/i86pc/kernel/drv/aha.conf
platform/i86pc/kernel/drv/asy.conf
platform/sun4u/boot.conf
"
#
# Third list: files extracted from generic.root but which belong in the global
# zone only: they are superfluous (and some even harmful) in nonglobal zones.
#
# (note: as /etc/init.d scripts are converted to smf(5) "Greenline" services,
# they (and their /etc/rc?.d hardlinks) should be removed from this list when
# they are added to smf_obsolete_rc_files, below)
#
superfluous_nonglobal_zone_files="
dev/dsk
dev/fd
dev/pts
dev/rdsk
dev/rmt
dev/stderr
dev/stdin
dev/stdout
dev/swap
dev/term
dev/vt
devices
etc/dacf.conf
etc/dat
etc/default/metassist.xml
etc/default/power
etc/flash/postdeployment/svm.cleanup
etc/flash/predeployment/svm.save
etc/inet/ipqosconf.1.sample
etc/inet/ipqosconf.2.sample
etc/inet/ipqosconf.3.sample
etc/inet/sock2path
etc/init.d/devlinks
etc/init.d/dodatadm.udaplt
etc/init.d/drvconfig
etc/init.d/llc2
etc/init.d/ncakmod
etc/init.d/ncalogd
etc/init.d/pcmcia
etc/init.d/pppd
etc/init.d/wrsmcfg
etc/llc2
etc/lvm
etc/nca
etc/openwin
etc/ppp
etc/rc0.d/K34ncalogd
etc/rc0.d/K50pppd
etc/rc0.d/K52llc2
etc/rc1.d/K34ncalogd
etc/rc1.d/K50pppd
etc/rc1.d/K52llc2
etc/rc2.d/S40llc2
etc/rc2.d/S42ncakmod
etc/rc2.d/S47pppd
etc/rc2.d/S81dodatadm.udaplt
etc/rc2.d/S94ncalogd
etc/rcS.d/K34ncalogd
etc/rcS.d/K44wrsmcfg
etc/rcS.d/K50pppd
etc/rcS.d/K52llc2
etc/rcS.d/S29wrsmcfg
etc/rcm
etc/sock2path
etc/usb
etc/wrsm
etc/zones
kernel
lib/libmeta.so
lib/libmeta.so.1
lib/svc/method/fc-fabric
lib/svc/method/iscsid
lib/svc/method/npivconfig
lib/svc/method/sf880dr
lib/svc/method/svc-cvcd
lib/svc/method/svc-dcs
lib/svc/method/svc-drd
lib/svc/method/svc-dscp
lib/svc/method/svc-dumpadm
lib/svc/method/svc-intrd
lib/svc/method/svc-hal
lib/svc/method/svc-labeld
lib/svc/method/svc-mdmonitor
lib/svc/method/svc-metainit
lib/svc/method/svc-metasync
lib/svc/method/svc-oplhpd
lib/svc/method/svc-poold
lib/svc/method/svc-pools
lib/svc/method/svc-power
lib/svc/method/svc-resource-mgmt
lib/svc/method/svc-rmvolmgr
lib/svc/method/svc-scheduler
lib/svc/method/svc-sckmd
lib/svc/method/svc-stmf
lib/svc/method/svc-syseventd
lib/svc/method/svc-tnctl
lib/svc/method/svc-tnd
lib/svc/method/svc-vntsd
lib/svc/method/svc-zones
lib/svc/method/vtdaemon
platform/*/kernel
platform/SUNW,Sun-Fire-15000/lib/cvcd
platform/SUNW,Ultra-Enterprise-10000/lib/cvcd
platform/i86pc/biosint
platform/i86pc/multiboot
platform/sun4u/cprboot
platform/sun4u/lib/libwrsmconf.so
platform/sun4u/lib/libwrsmconf.so.1
platform/sun4u/lib/sparcv9/libwrsmconf.so
platform/sun4u/lib/sparcv9/libwrsmconf.so.1
platform/sun4u/sbin
platform/sun4u/wanboot
platform/sun4v/wanboot
sbin/metadb
sbin/metadevadm
sbin/metainit
sbin/metarecover
sbin/metastat
usr/include/sys/dcam
usr/lib/devfsadm/linkmod/SUNW_dcam1394_link.so
usr/lib/ldoms
usr/platform/SUNW,SPARC-Enterprise/lib/dscp.ppp.options
usr/platform/SUNW,SPARC-Enterprise/lib/libdscp.so
usr/platform/SUNW,SPARC-Enterprise/lib/libdscp.so.1
usr/platform/SUNW,SPARC-Enterprise/lib/llib-ldscp.ln
usr/platform/SUNW,SPARC-Enterprise/sbin/prtdscp
var/adm/pool
var/log/pool
var/svc/manifest/network/iscsi_initiator.xml
var/svc/manifest/network/npiv_config.xml
var/svc/manifest/network/rpc/mdcomm.xml
var/svc/manifest/network/rpc/meta.xml
var/svc/manifest/network/rpc/metamed.xml
var/svc/manifest/network/rpc/metamh.xml
var/svc/manifest/network/tnctl.xml
var/svc/manifest/network/tnd.xml
var/svc/manifest/platform/i86pc/eeprom.xml
var/svc/manifest/platform/sun4u/dcs.xml
var/svc/manifest/platform/sun4u/dscp.xml
var/svc/manifest/platform/sun4u/efdaemon.xml
var/svc/manifest/platform/sun4u/oplhpd.xml
var/svc/manifest/platform/sun4u/sckmd.xml
var/svc/manifest/platform/sun4u/sf880drd.xml
var/svc/manifest/platform/sun4v
var/svc/manifest/system/cvc.xml
var/svc/manifest/system/device/devices-fc-fabric.xml
var/svc/manifest/system/dumpadm.xml
var/svc/manifest/system/filesystem/rmvolmgr.xml
var/svc/manifest/system/fmd.xml
var/svc/manifest/system/hal.xml
var/svc/manifest/system/intrd.xml
var/svc/manifest/system/labeld.xml
var/svc/manifest/system/mdmonitor.xml
var/svc/manifest/system/metainit.xml
var/svc/manifest/system/metasync.xml
var/svc/manifest/system/picl.xml
var/svc/manifest/system/poold.xml
var/svc/manifest/system/pools.xml
var/svc/manifest/system/power.xml
var/svc/manifest/system/resource-mgmt.xml
var/svc/manifest/system/scheduler.xml
var/svc/manifest/system/stmf.xml
var/svc/manifest/system/sysevent.xml
var/svc/manifest/system/vtdaemon.xml
var/svc/manifest/system/zones.xml
"
#
# Fourth list: files to be preserved, ie unconditionally restored to
# "child" versions
#
preserve_files="
etc/hostid
kernel/misc/amd64/sysinit
kernel/misc/amd64/usbs49_fw
kernel/misc/sparcv9/usbs49_fw
kernel/misc/sysinit
kernel/misc/usbs49_fw
var/adm/aculog
var/adm/spellhist
var/adm/utmpx
var/adm/wtmpx
var/log/authlog
var/log/syslog
var/saf/zsmon/log
"
realmode_files="
boot/solaris/bootenv.rc
boot/solaris/devicedb/master
"
#
# /usr/sadm/install/scripts/i.build class runs class client provided
# script. The files below are managed by build class and its build script.
# They are added /bfu.conflict/NEW and the acr.sh process runs the script
# as part of conflict resolution.
#
build_class_script_files="
etc/mpapi.conf
etc/hba.conf
etc/ima.conf
"
fail() {
print "$*" >& 2
print "bfu aborting" >& 2
rm -f "$bfu_zone_list"
exit 1
}
filelist() {
files="$all_zones_files $preserve_files"
if [ $1 = "global" ]; then
files="$global_zone_only_files $files"
fi
find $files -depth -type f ! -name core -print 2>/dev/null | sort -u || {
#
# Force cpio to return non-zero by printing an error message
# to stdout that it won't be able to lstat().
#
echo 'filelist: sort failed'
fail "sort failed"
}
}
realmode_filelist() {
find $realmode_files -depth -type f ! -name core -print 2>/dev/null | sort
}
smf_inetd_conversions="
100134
100150
100155
100229
100230
100234
100242
100422
chargen
comsat
daytime
discard
echo
eklogin
exec
finger
ftp
gssd
klogin
krb5_prop
kshell
ktkt_warnd
login
metad
metamedd
metamhd
name
ocfserv
printer
rexd
rquotad
rstatd
rusersd
shell
smserverd
sprayd
sun-dr
talk
telnet
time
uucp
walld
"
enable_next_boot () {
if [ -x /tmp/bfubin/svccfg ]; then
svcadm disable -t $1
[ $? = 0 ] || echo "warning: unable to temporarily disable $1"
svccfg -s $1 setprop general/enabled = true
[ $? = 0 ] || echo "warning: unable to enable $1 for next boot"
fi
}
#
# If we're in the global zone, import the manifest for the specified service.
# Note that we will need to see whether we are in an smf root if we are using
# an alternate root. If so, import the service directly; otherwise, print the
# warning messages.
#
# $1: the path of the xml file (the related path to /var/svc/manifest)
# $2: the service name - specified only if the service is enabled after reboot.
#
smf_import_service() {
if [[ $zone = global && -f $rootprefix/var/svc/manifest/$1 ]]; then
if [[ -n $rootprefix && -x /usr/sbin/svccfg ]]; then
SVCCFG_REPOSITORY=$rootprefix/etc/svc/repository.db \
/usr/sbin/svccfg import $rootprefix/var/svc/manifest/$1
elif [[ -n $rootprefix ]]; then
echo "Warning: This system does not have SMF, so I"
echo "cannot ensure the pre-import of $1. If it does"
echo "not work, reboot your alternate root to fix it."
elif [[ -x /tmp/bfubin/svccfg ]]; then
if [[ "${2}a" == a ]]; then
/tmp/bfubin/svccfg import /var/svc/manifest/$1
else
tmpfile=/tmp/`echo "$1" | tr / :`.$$
sed -e "s/enabled='true'/enabled='false'/" \
/var/svc/manifest/$1 > "$tmpfile"
/tmp/bfubin/svccfg import "$tmpfile"
#
# Make sure the service is enabled after reboot.
#
enable_next_boot $2
fi
fi
fi
}
smf_inetd_disable() {
inetconf=$rootprefix/etc/inet/inetd.conf
inettmp=/tmp/inetd.tmp.$$
sed "$(for i in $smf_inetd_conversions; do
echo "s:^[ ]*$i[ /]:#SMFbfu# &:"
done)" $inetconf > $inettmp && ! cmp -s $inettmp $inetconf &&
cp $inettmp $inetconf
rm -f -- $inettmp
}
smf_inetd_reenable() {
inetconf=$rootprefix/etc/inet/inetd.conf
inettmp=/tmp/inetd.tmp.$$
sed 's/^#SMFbfu# //' $inetconf > $inettmp && cp $inettmp $inetconf
rm -f -- $inettmp
}
smf_tftp_reinstall() {
inetconf=$rootprefix/etc/inet/inetd.conf
inettmp=/tmp/inetd.tmp.$$
if grep '^#SMFbfu# tftp' $inetconf >/dev/null ; then
# BFU previously commented out, put it back in place
sed 's/^#SMFbfu# tftp/tftp/' $inetconf > $inettmp &&
cp $inettmp $inetconf
elif ! grep '^[# ]*tftp' $inetconf >/dev/null; then
# No entry, append to end
cat >>$inetconf <<EOF
# TFTPD - tftp server (primarily used for booting)
#tftp dgram udp6 wait root /usr/sbin/in.tftpd in.tftpd -s /tftpboot
EOF
fi
rm -f -- $inettmp
}
inetd_conf_svm_hack() {
# Since inetd.conf is updated by SUNWmdr's postinstall script,
# we will update the actual inetd.conf here to reflect the postinstall
# changes.
inetconf=$rootprefix/etc/inet/inetd.conf
inettmp=/tmp/inetd.tmp.$$
inetnew=/tmp/inetd.new.$$
#
# only change inetd.conf if the rpc.metad entry is out of date
#
if ! grep "^[# ]*100229/1-2" $inetconf > /dev/null ; then
# Grab existing rpc entries for rpc.metad
# and convert spaces to tabs within the rpc entry, as well as
# the transport method;
# or add a new entry in case there was none.
if grep "^[# ]*100229/1" $inetconf > /dev/null ; then
grep "^# METAD - SLVM metadb" $inetconf > $inettmp
grep "^[# ]*100229/1" $inetconf | \
sed -e 's/[ ][ ]*/ /g' \
-e 's?100229/1?100229/1-2?' >> $inettmp
else
echo '# METAD - SVM metadb Daemon' > $inettmp
echo "100229/1-2\ttli\trpc/tcp\twait\troot\t/usr/sbin/rpc.metad\trpc.metad" >> $inettmp
fi
grep -v '^# METAD - SLVM metadb' $inetconf | \
grep -v '^[# ]*100229/1' > $inetnew
cat $inettmp >> $inetnew
if ! diff $inetnew $inetconf > /dev/null ; then
print "Updating inet.conf metad entry ... \c"
if cp $inetnew $inetconf ; then
print "done."
else
print "failed."
fi
fi
rm -f $inettmp $inetnew
fi
#
# only change inetd.conf if the rpc.mdcommd entry is out of date
#
if ! grep "^[# ]*100422/1" $inetconf > /dev/null ; then
# Grab existing rpc entries for rpc.mdcommd
# and convert spaces to tabs within the rpc entry,
# or add a new entry in case there was none.
if grep "^[# ]*100422/1" $inetconf > /dev/null ; then
grep "^# MDMN_COMMD - SVM Multi node" $inetconf > $inettmp
grep "^[# ]*100422/1" $inetconf | \
sed -e 's/[ ][ ]*/ /g' >> $inettmp
else
echo '# MDMN_COMMD - SVM Multi node communication daemon' >$inettmp
echo '100422/1\ttli\trpc/tcp\twait\troot\t/usr/sbin/rpc.mdcommd\trpc.mdcommd' >> $inettmp
fi
grep -v '^# MDMN_COMMD - SVM Multi node' $inetconf | \
grep -v '^[# ]*100422/1' > $inetnew
cat $inettmp >> $inetnew
if ! diff $inetnew $inetconf > /dev/null ; then
print "Updating inetd.conf rpc.mdcommd entry ... \c"
if cp $inetnew $inetconf; then
print "done."
else
print "failed."
fi
fi
rm -f $inettmp $inetnew
fi
}
upgrade_aggr_and_linkprop () {
# Since aggregation.conf and linkprop.conf are upgraded by
# SUNWcnetr's postinstall script, put the relevant portions of the
# postinstall script here, modified to rename the old files instead
# of removing them.
#
# Convert datalink configuration into a series of dladm(1M) commands
# and keep them in an upgrade script. This script will then be run
# in the network-physical service.
#
# Note that we cannot use the /var/svc/profile/upgrade script because
# that script is run in the manifest-import service which is too late
# for the datalink configuration.
#
UPGRADE_SCRIPT=/var/svc/profile/upgrade_datalink
AGGR_CONF=/etc/aggregation.conf
ORIG=$rootprefix$AGGR_CONF
if [[ ! -f $ORIG ]]; then
# Try the alternate location.
AGGR_CONF=/etc/dladm/aggregation.conf
ORIG=$rootprefix$AGGR_CONF
fi
if [[ -f $ORIG ]]; then
# Strip off comments, then each remaining line defines
# an aggregation the administrator configured on the old
# system. Each line corresponds to one dladm command
# that is appended to the upgrade script.
cat $ORIG | grep '^[^#]' | while read line; do
echo $line | while read aggr_index rest
do
policy=`echo $rest | /usr/bin/awk '{print $1}'`
nports=`echo $rest | /usr/bin/awk '{print $2}'`
ports=`echo $rest | /usr/bin/awk '{print $3}'`
mac=`echo $rest | /usr/bin/awk '{print $4}'`
lacp_mode=`echo $rest | /usr/bin/awk \
'{print $5}'`
lacp_timer=`echo $rest | /usr/bin/awk \
'{print $6}'`
dladm_string="dladm create-aggr -P $policy -l \
$lacp_mode -T $lacp_timer"
# A fixed MAC address
if [[ $mac != "auto" ]]; then
dladm_string="$dladm_string -u $mac"
fi
i=1
while [ $i -le $nports ]; do
device=`echo $ports | cut -d, -f$i`
# Older aggregation.conf files have the
# format of device_name/port_number.
# We don't need the port number, so get
# rid of it if it is there.
device=`echo $device | cut -d/ -f1`
((i = i + 1))
dladm_string="$dladm_string -d \
$device"
done
dladm_string="$dladm_string $aggr_index"
echo $dladm_string >> \
$rootprefix$UPGRADE_SCRIPT
done
done
mv $ORIG $ORIG.bak
fi
# Upgrade linkprop.conf
ORIG=$rootprefix/etc/dladm/linkprop.conf
if [[ -f $ORIG ]]; then
# Strip off comments, then each remaining line lists
# properties the administrator configured for a
# particular interface. Each line includes several
# properties, but we can only set one property per
# dladm invocation.
cat $ORIG | grep '^[^#]' | while read line; do
echo $line | while read link rest
do
while [ -n "$rest" ]; do
linkprop=`echo $rest | cut -d";" -f1`
rest=`echo $rest | cut -d";" -f2-`
echo dladm set-linkprop -p $linkprop \
$link >> $rootprefix$UPGRADE_SCRIPT
done
done
done
mv $ORIG $ORIG.bak
fi
}
upgrade_vlan () {
# Convert hostname.*** and zonecfg vlan configurations
UPGRADE_SCRIPT=/var/svc/profile/upgrade_datalink
for ifname in $host_ifs $zone_ifs
do
phys=`echo $ifname | sed "s/[0-9]*$//"`
devnum=`echo $ifname | sed "s/$phys//g"`
if [ "$phys$devnum" != $ifname -o \
-n "`echo $devnum | tr -d '[0-9]'`" ]; then
echo "skipping invalid interface $ifname"
continue
fi
vid=`expr $devnum / 1000`
inst=`expr $devnum % 1000`
if [ "$vid" != "0" ]; then
echo dladm create-vlan -l $phys$inst -v $vid $ifname \
>> $rootprefix$UPGRADE_SCRIPT
fi
done
}
# Update aac.conf for set legacy-name-enable properly
update_aac_conf()
{
conffile=$rootprefix/kernel/drv/aac.conf
childconffile=$rootprefix/bfu.child/kernel/drv/aac.conf
# Already using autoenumeration mode, return
egrep -s "legacy-name-enable" $childconffile && \
grep "legacy-name-enable" $childconffile | egrep -s "no" && return
# Else enable legacy mode
sed -e 's/legacy-name-enable="no"/legacy-name-enable="yes"/g' \
< $conffile > /tmp/aac.conf.$$
mv -f /tmp/aac.conf.$$ $conffile
}
# update x86 version mpt.conf for property tape
mpttapeprop='[ ]*tape[ ]*=[ ]*"sctp"[ ]*;'
update_mptconf_i386()
{
conffile=$rootprefix/kernel/drv/mpt.conf
test -f $conffile || return
egrep -s "$mpttapeprop" $conffile
if [ $? -ne 0 ] ; then
echo 'tape="sctp";' >> $conffile
fi
}
# update x86 etc/mach file after xVM_uppc is added,
# which makes xpv_psm a non-default psm module
update_etc_mach_i386()
{
etc_mach=$rootprefix/etc/mach
test -f $etc_mach || return
grep -w "xpv_psm" $etc_mach > /dev/null 2>&1
if [ $? -ne 0 ] ; then
echo 'xpv_psm' >> $etc_mach
fi
}
# check and update driver class for scsi-self-identifying
chk_update_drv_class()
{
drvclassfile=$rootprefix/etc/driver_classes
name2majorfile=$rootprefix/etc/name_to_major
drvname=$1
classentry="^$drvname[ ].*scsi-self-identifying"
[ -f $drvclassfile ] || return
[ -f $name2majorfile ] || return
grep -w $drvname $name2majorfile > /dev/null 2>&1 || return
egrep -s "$classentry" $drvclassfile
if [ $? -ne 0 ]; then
echo "$drvname scsi-self-identifying" >> $drvclassfile
fi
}
update_drvclass_i386()
{
chk_update_drv_class ahci
chk_update_drv_class si3124
chk_update_drv_class marvell88sx
chk_update_drv_class nv_sata
}
update_policy_conf() {
# update /etc/security/policy.conf with the default
# Solaris crypt(3c) policy.
dest=$rootprefix/etc/security/policy.conf
grep 'CRYPT_' $dest > /dev/null 2>&1
if [ $? = 1 ] ; then
print "Updating entries for crypt(3c), see policy.conf(4)"
cat >> $dest <<EOM
# crypt(3c) Algorithms Configuration
#
# CRYPT_ALGORITHMS_ALLOW specifies the algorithms that are allowed to
# be used for new passwords. This is enforced only in crypt_gensalt(3c).
#
CRYPT_ALGORITHMS_ALLOW=1,2a,md5
# To deprecate use of the traditional unix algorithm, uncomment below
# and change CRYPT_DEFAULT= to another algorithm. For example,
# CRYPT_DEFAULT=1 for BSD/Linux MD5.
#
#CRYPT_ALGORITHMS_DEPRECATE=__unix__
# The Solaris default is the traditional UNIX algorithm. This is not
# listed in crypt.conf(4) since it is internal to libc. The reserved
# name __unix__ is used to refer to it.
#
CRYPT_DEFAULT=__unix__
EOM
fi
grep PRIV_ $dest >/dev/null 2>&1
if [ $? = 1 ]; then
echo "Updating entries for privileges(5)," \
"see policy.conf(4) for details."
cat >> $dest <<EOM
#
# These settings determine the default privileges users have. If not set,
# the default privileges are taken from the inherited set.
# There are two different settings; PRIV_DEFAULT determines the default
# set on login; PRIV_LIMIT defines the Limit set on login.
# Individual users can have privileges assigned or taken away through
# user_attr. Privileges can also be assigned to profiles in which case
# the users with those profiles can use those privileges through pfexec(1m).
# For maximum future compatibility, the specifications should
# always include "basic" or "all"; privileges should then be removed using
# the negation. E.g., PRIV_LIMIT=all,!sys_linkdir takes away only the
# sys_linkdir privilege, regardless of future additional privileges.
# Similarly, PRIV_DEFAULT=basic,!file_link_any takes away only the
# file_link_any privilege from the basic privilege set; only that notation
# is immune from a future addition of currently unprivileged operations to
# the basic privilege set.
# NOTE: removing privileges from the the Limit set requires EXTREME care
# as any set-uid root program may suddenly fail because it lacks certain
# privilege(s).
#
#PRIV_DEFAULT=basic
#PRIV_LIMIT=all
EOM
fi
}
#
# Cleanup nfsmapid configuration before extracting
# root bits. Remove if they exist:
# nfsmapid entry in inetd.conf
# nfsmapid entry in /etc/net/ti*/services
#
# Going forward neither should exist, but no harm if services entry exists
# Going way backwards (pre-04/28/2004), inetd.conf must exist but will
# be a conflict that should be merged in
#
nfsmapid_cfg() {
inetdconf=$rootprefix/etc/inet/inetd.conf
tmpinetcf=/tmp/inetd.conf.$$
cp -pf ${inetdconf} ${tmpinetcf}
cat /dev/null > ${inetdconf} 2>&1
sed -e "/^#[# ]*NFSv4/d" \
-e "/^[# ]*100166\/1/d" \
${tmpinetcf} > ${inetdconf} 2>&1
rm -f ${tmpinetcf}
tmpservices=/tmp/services.$$
services=$rootprefix/etc/net/ticotsord/services
cp -pf ${services} ${tmpservices}
cat /dev/null > ${services} 2>&1
sed -e "/^[# ]*nfsmapid/d" \
${tmpservices} > ${services} 2>&1
rm -f ${tmpservices}
services=$rootprefix/etc/net/ticots/services
cp -pf ${services} ${tmpservices}
cat /dev/null > ${services} 2>&1
sed -e "/^[# ]*nfsmapid/d" \
${tmpservices} > ${services} 2>&1
rm -f ${tmpservices}
services=$rootprefix/etc/net/ticlts/services
cp -pf ${services} ${tmpservices}
cat /dev/null > ${services} 2>&1
sed -e "/^[# ]*nfsmapid/d" \
${tmpservices} > ${services} 2>&1
rm -f ${tmpservices}
}
#
# Define global variables
#
CALL_DEVID_DESTROY=""
#
# List of SDS commands that must be deleted.
#
SDSCMDLIST="
growfs
metaclear
metadb
metadetach
metahs
metainit
metaoffline
metaonline
metaparam
metarename
metareplace
metaroot
metaset
metastat
metasync
metattach
rpc.metad
rpc.metamhd
"
#
# List of SDS configuration files that must be deleted.
#
SDSCONFIGLIST="
lock
md.cf
mddb.cf
md.tab
devpath
md.ctlrmap
"
#
# List of rc scripts that must be deleted.
#
RCLIST="
etc/init.d/SUNWmd.init
etc/init.d/SUNWmd.sync
etc/init.d/lvm.init
etc/init.d/lvm.sync
etc/rcS.d/S35SUNWmd.init
etc/rcS.d/S35lvm.init
etc/rc2.d/S95SUNWmd.sync
etc/rc2.d/S95lvm.sync
etc/rcS.d/S35slvm.init
etc/rc2.d/S95slvm.sync
etc/init.d/slvm.init
etc/init.d/slvm.sync
etc/init.d/init.mdlogd
etc/rc3.d/S25mdlogd
"
#
# List of flashprom-related files that must be deleted.
#
FLASHPROMLIST="
etc/rc2.d/S75flashprom
etc/init.d/flashprom
usr/platform/SUNW,Ultra-2/lib/flash-update.sh
usr/platform/SUNW,Ultra-4/lib/flash-update.sh
usr/platform/SUNW,Ultra-Enterprise/lib/flash-update.sh
usr/platform/sun4u/doc/flashupdate.txt
usr/platform/sun4u/lib/flash-update.sh
usr/platform/sun4u/lib/prom/SUNW,Ultra-2
usr/platform/sun4u/lib/prom/SUNW,Ultra-4
usr/platform/sun4u/lib/prom/SUNW,Ultra-Enterprise
"
#
# delete the entries associated with bootlist from /etc/system
#
delete_system_bootlist() {
sed -e /"Begin MDD database info"/,/"End MDD database info"/d \
< ${SYSTEM_FILE} > /tmp/system.$$
cp /tmp/system.$$ ${SYSTEM_FILE} || \
echo "copy error: /tmp/system.$$ to ${SYSTEM_FILE}"
}
#
# Add entries in md.conf for bootlist
#
fix_mdconf() {
cp ${mdconf} /tmp/md.conf.$$
echo >> /tmp/md.conf.$$
echo "# Begin MDD database info (do not edit)" >> /tmp/md.conf.$$
sed -e 's/^set md://' -e 's/$/;/' ${SYSTEM_FILE} | \
grep mddb_bootlist >> /tmp/md.conf.$$
echo "# End MDD database info (do not edit)" >> /tmp/md.conf.$$
cp /tmp/md.conf.$$ ${mdconf} || \
echo "copy error: /tmp/md.conf.$$ to ${mdconf}"
}
#
# add_devid_destroy(filename)
# returns contents in filename
# md_devid_destroy property is required when upgrading
# from pre SVM to SVM releases or when the device ID returned from
# the driver changes.
# It is specifically placed between
# # Begin MDD database info and # End MDD database info because
# on the subsequent reboot, this line will be removed automatically when
# metadevadm is run in rc2.d.
#
add_devid_destroy() {
cat $1 | awk '{
if ( $2 == "End" && $4 == "database") {
print "md_devid_destroy=1;"
}
print $0
}' >> /tmp/t$$
mv /tmp/t$$ $1
}
#
# Reads existing configuration values in /etc/rcap.conf and puts
# them in repository upon reboot(via /var/svc/profile/upgrade).
#
migrate_rcap_conf() {
RCAP_CONF="${rootprefix}/etc/rcap.conf"
PROFILE_UPGRADE="${rootprefix}/var/svc/profile/upgrade"
SVCCFG="/usr/sbin/svccfg"
RCAP_FMRI="svc:/system/rcap:default"
PG="config"
pressure=`awk '$1 == "RCAPD_MEMORY_CAP_ENFORCEMENT_PRESSURE" \
&& NF == 3 {print $3}' $RCAP_CONF`
reconfig_int=`awk '$1 == "RCAPD_RECONFIGURATION_INTERVAL" \
&& NF == 3 {print $3}' $RCAP_CONF`
walk_int=`awk '$1 == "RCAPD_PROC_WALK_INTERVAL" && \
NF == 3 {print $3}' $RCAP_CONF`
report_int=`awk '$1 == "RCAPD_REPORT_INTERVAL" && \
NF == 3 {print $3}' $RCAP_CONF`
rss_sample_int=`awk '$1 == "RCAPD_RSS_SAMPLE_INTERVAL" && \
NF == 3 {print $3}' $RCAP_CONF`
# Blindly update default configuration values with
# pre-existing values
#
echo "# Migrating pre-existing rcap configuration" >> \
$PROFILE_UPGRADE
echo "$SVCCFG -s $RCAP_FMRI setprop ${PG}/pressure = " \
"$pressure" >> $PROFILE_UPGRADE
echo "$SVCCFG -s $RCAP_FMRI " \
"setprop ${PG}/reconfig_interval = $reconfig_int" >> \
$PROFILE_UPGRADE
echo "$SVCCFG -s $RCAP_FMRI " \
"setprop ${PG}/walk_interval = $walk_int" >> \
$PROFILE_UPGRADE
echo "$SVCCFG -s $RCAP_FMRI " \
"setprop ${PG}/report_interval = $report_int" >> \
$PROFILE_UPGRADE
echo "$SVCCFG -s $RCAP_FMRI " \
"setprop ${PG}/rss_sample_interval = $rss_sample_int" >> \
$PROFILE_UPGRADE
echo "/usr/sbin/svcadm refresh $RCAP_FMRI" >> \
$PROFILE_UPGRADE
echo "rm /etc/rcap.conf" >> \
$PROFILE_UPGRADE
}
#
# Migrate an existing extended accounting configuration from /etc/acctadm.conf
# to the smf(5) repository upon reboot. Enable the instance if the
# configuration differs from the default configuration.
#
migrate_acctadm_conf()
{
cat >> $rootprefix/var/svc/profile/upgrade <<\_EOF
if [ -f /etc/acctadm.conf ]; then
. /etc/acctadm.conf
fmri="svc:/system/extended-accounting:flow"
svccfg -s $fmri setprop config/file = \
${ACCTADM_FLOW_FILE:="none"}
svccfg -s $fmri setprop config/tracked = \
${ACCTADM_FLOW_TRACKED:="none"}
svccfg -s $fmri setprop config/untracked = \
${ACCTADM_FLOW_UNTRACKED:="extended"}
if [ ${ACCTADM_FLOW_ENABLE:="no"} = "yes" ]; then
svccfg -s $fmri setprop config/enabled = "true"
else
svccfg -s $fmri setprop config/enabled = "false"
fi
if [ $ACCTADM_FLOW_ENABLE = "yes" -o \
$ACCTADM_FLOW_FILE != "none" -o \
$ACCTADM_FLOW_TRACKED != "none" ]; then
svcadm enable $fmri
fi
fmri="svc:/system/extended-accounting:process"
svccfg -s $fmri setprop config/file = \
${ACCTADM_PROC_FILE:="none"}
svccfg -s $fmri setprop config/tracked = \
${ACCTADM_PROC_TRACKED:="none"}
svccfg -s $fmri setprop config/untracked = \
${ACCTADM_PROC_UNTRACKED:="extended"}
if [ ${ACCTADM_PROC_ENABLE:="no"} = "yes" ]; then
svccfg -s $fmri setprop config/enabled = "true"
else
svccfg -s $fmri setprop config/enabled = "false"
fi
if [ $ACCTADM_PROC_ENABLE = "yes" -o \
$ACCTADM_PROC_FILE != "none" -o \
$ACCTADM_PROC_TRACKED != "none" ]; then
svcadm enable $fmri
fi
fmri="svc:/system/extended-accounting:task"
svccfg -s $fmri setprop config/file = \
${ACCTADM_TASK_FILE:="none"}
svccfg -s $fmri setprop config/tracked = \
${ACCTADM_TASK_TRACKED:="none"}
svccfg -s $fmri setprop config/untracked = \
${ACCTADM_TASK_UNTRACKED:="extended"}
if [ ${ACCTADM_TASK_ENABLE:="no"} = "yes" ]; then
svccfg -s $fmri setprop config/enabled = "true"
else
svccfg -s $fmri setprop config/enabled = "false"
fi
if [ $ACCTADM_TASK_ENABLE = "yes" -o \
$ACCTADM_TASK_FILE != "none" -o \
$ACCTADM_TASK_TRACKED != "none" ]; then
svcadm enable $fmri
fi
fmri="svc:/system/extended-accounting:net"
svccfg -s $fmri setprop config/file = \
${ACCTADM_NET_FILE:="none"}
svccfg -s $fmri setprop config/tracked = \
${ACCTADM_NET_TRACKED:="none"}
svccfg -s $fmri setprop config/untracked = \
${ACCTADM_NET_UNTRACKED:="extended"}
if [ ${ACCTADM_NET_ENABLE:="no"} = "yes" ]; then
svccfg -s $fmri setprop config/enabled = "true"
else
svccfg -s $fmri setprop config/enabled = "false"
fi
if [ $ACCTADM_NET_ENABLE = "yes" -o \
$ACCTADM_NET_FILE != "none" -o \
$ACCTADM_NET_TRACKED != "none" ]; then
svcadm enable $fmri
fi
rm /etc/acctadm.conf
fi
_EOF
}
#
# smf(5) "Greenline" doesn't install the init.d or rc*.d scripts for
# converted services. Clean up previous scripts for such services.
#
smf_obsolete_rc_files="
etc/init.d/ANNOUNCE
etc/init.d/MOUNTFSYS
etc/init.d/RMTMPFILES
etc/init.d/acctadm
etc/init.d/audit
etc/init.d/autofs
etc/init.d/coreadm
etc/init.d/cron
etc/init.d/cryptosvc
etc/init.d/cvc
etc/init.d/devfsadm
etc/init.d/dhcp
etc/init.d/dhcpagent
etc/init.d/domainname
etc/init.d/efcode
etc/init.d/inetd
etc/init.d/inetinit
etc/init.d/inetsvc
etc/init.d/initboot
etc/init.d/ipfboot
etc/init.d/kdc
etc/init.d/kdc.master
etc/init.d/keymap
etc/init.d/ldap.client
etc/init.d/libc.mount
etc/init.d/network
etc/init.d/nfs.client
etc/init.d/nodename
etc/init.d/nscd
etc/init.d/perf
etc/init.d/picld
etc/init.d/power
etc/init.d/rcapd
etc/init.d/rootusr
etc/init.d/rpc
etc/init.d/savecore
etc/init.d/sckm
etc/init.d/sf880dr
etc/init.d/slpd
etc/init.d/sshd
etc/init.d/standardmounts
etc/init.d/svm.init
etc/init.d/svm.sync
etc/init.d/sysid.net
etc/init.d/sysid.sys
etc/init.d/syslog
etc/init.d/utmpd
etc/init.d/volmgt
etc/init.d/xntpd
etc/init.d/zones
etc/rc0.d/K00ANNOUNCE
etc/rc0.d/K01zones
etc/rc0.d/K03sshd
etc/rc0.d/K05volmgt
etc/rc0.d/K07snmpdx
etc/rc0.d/K10rcapd
etc/rc0.d/K21dhcp
etc/rc0.d/K28kdc
etc/rc0.d/K28kdc.master
etc/rc0.d/K28nfs.server
etc/rc0.d/K32cryptosvc
etc/rc0.d/K33audit
etc/rc0.d/K33efcode
etc/rc0.d/K34svm.sync
etc/rc0.d/K36sendmail
etc/rc0.d/K36utmpd
etc/rc0.d/K37power
etc/rc0.d/K40cron
etc/rc0.d/K40inetd
etc/rc0.d/K40nscd
etc/rc0.d/K40sf880dr
etc/rc0.d/K40slpd
etc/rc0.d/K40syslog
etc/rc0.d/K40xntpd
etc/rc0.d/K41autofs
etc/rc0.d/K41ldap.client
etc/rc0.d/K41nfs.client
etc/rc0.d/K41rpc
etc/rc0.d/K42sckm
etc/rc0.d/K43inet
etc/rc0.d/K68picld
etc/rc0.d/K83devfsadm
etc/rc0.d/K90dhcpagent
etc/rc1.d/K00ANNOUNCE
etc/rc1.d/K01zones
etc/rc1.d/K03sshd
etc/rc1.d/K05volmgt
etc/rc1.d/K07snmpdx
etc/rc1.d/K10rcapd
etc/rc1.d/K21dhcp
etc/rc1.d/K28kdc
etc/rc1.d/K28kdc.master
etc/rc1.d/K28nfs.server
etc/rc1.d/K33audit
etc/rc1.d/K33efcode
etc/rc1.d/K34svm.sync
etc/rc1.d/K36sendmail
etc/rc1.d/K36utmpd
etc/rc1.d/K37power
etc/rc1.d/K40cron
etc/rc1.d/K40inetd
etc/rc1.d/K40nscd
etc/rc1.d/K40sf880dr
etc/rc1.d/K40slpd
etc/rc1.d/K40syslog
etc/rc1.d/K40xntpd
etc/rc1.d/K41autofs
etc/rc1.d/K41ldap.client
etc/rc1.d/K41rpc
etc/rc1.d/K42sckm
etc/rc1.d/K43inet
etc/rc1.d/K99libc.mount
etc/rc1.d/S01MOUNTFSYS
etc/rc2.d/K01zones
etc/rc2.d/K03sshd
etc/rc2.d/K05volmgt
etc/rc2.d/K07snmpdx
etc/rc2.d/K21dhcp
etc/rc2.d/K28kdc
etc/rc2.d/K28kdc.master
etc/rc2.d/K28nfs.server
etc/rc2.d/S01MOUNTFSYS
etc/rc2.d/S05RMTMPFILES
etc/rc2.d/S21perf
etc/rc2.d/S30sysid.net
etc/rc2.d/S65ipfboot
etc/rc2.d/S69domainname
etc/rc2.d/S69inet
etc/rc2.d/S70sckm
etc/rc2.d/S71ldap.client
etc/rc2.d/S71rpc
etc/rc2.d/S71sysid.sys
etc/rc2.d/S72inetsvc
etc/rc2.d/S72slpd
etc/rc2.d/S73nfs.client
etc/rc2.d/S74autofs
etc/rc2.d/S74syslog
etc/rc2.d/S74xntpd
etc/rc2.d/S75cron
etc/rc2.d/S75savecore
etc/rc2.d/S76nscd
etc/rc2.d/S77inetd
etc/rc2.d/S77sf880dr
etc/rc2.d/S85power
etc/rc2.d/S88sendmail
etc/rc2.d/S88utmpd
etc/rc2.d/S95svm.sync
etc/rc2.d/S98efcode
etc/rc2.d/S98libc.mount
etc/rc2.d/S99audit
etc/rc2.d/S99rcapd
etc/rc3.d/S13kdc.master
etc/rc3.d/S14kdc
etc/rc3.d/S15nfs.server
etc/rc3.d/S34dhcp
etc/rc3.d/S76snmpdx
etc/rc3.d/S81volmgt
etc/rc3.d/S89sshd
etc/rc3.d/S99zones
etc/rcS.d/K01zones
etc/rcS.d/K03sshd
etc/rcS.d/K05volmgt
etc/rcS.d/K07snmpdx
etc/rcS.d/K10rcapd
etc/rcS.d/K21dhcp
etc/rcS.d/K28kdc
etc/rcS.d/K28kdc.master
etc/rcS.d/K28nfs.server
etc/rcS.d/K33audit
etc/rcS.d/K33efcode
etc/rcS.d/K34svm.sync
etc/rcS.d/K36sendmail
etc/rcS.d/K36utmpd
etc/rcS.d/K37power
etc/rcS.d/K40cron
etc/rcS.d/K40inetd
etc/rcS.d/K40nscd
etc/rcS.d/K40sf880dr
etc/rcS.d/K40slpd
etc/rcS.d/K40syslog
etc/rcS.d/K40xntpd
etc/rcS.d/K41autofs
etc/rcS.d/K41ldap.client
etc/rcS.d/K41rpc
etc/rcS.d/K42sckm
etc/rcS.d/K43inet
etc/rcS.d/K99libc.mount
etc/rcS.d/S10cvc
etc/rcS.d/S28network.sh
etc/rcS.d/S29nodename.sh
etc/rcS.d/S30rootusr.sh
etc/rcS.d/S33keymap.sh
etc/rcS.d/S35svm.init
etc/rcS.d/S40standardmounts.sh
etc/rcS.d/S42coreadm
etc/rcS.d/S45initboot
etc/rcS.d/S50devfsadm
etc/rcS.d/S72cryptosvc
etc/rcS.d/S95picld
"
# Obsolete smf manifests
smf_obsolete_manifests="
var/svc/manifest/application/print/cleanup.xml
var/svc/manifest/network/tftp.xml
var/svc/manifest/network/lp.xml
var/svc/manifest/system/filesystem/volfs.xml
var/svc/manifest/network/pfil.xml
var/svc/manifest/platform/sun4u/mpxio-upgrade.xml
var/svc/manifest/network/tname.xml
var/svc/manifest/network/aggregation.xml
var/svc/manifest/network/datalink.xml
var/svc/manifest/network/datalink-init.xml
"
# smf services whose manifests have been renamed
smf_renamed_manifests="
var/svc/manifest/milestone/name-service.xml
var/svc/manifest/system/filesystem/boot-archive.xml
"
# Obsolete smf methods
smf_obsolete_methods="
lib/svc/method/print-cleanup
lib/svc/method/print-server
lib/svc/method/svc-volfs
lib/svc/method/pfil
lib/svc/method/aggregation
lib/svc/method/datalink
lib/svc/method/datalink-init
lib/svc/method/svc-kdc
lib/svc/method/svc-kdc.master
lib/svc/method/svc-kdc.slave
lib/svc/share/krb_include.sh
"
smf_cleanup () {
(
cd $root;
print "Removing obsolete rc.d scripts ... \c"
rm -f $smf_obsolete_rc_files
print "done."
)
}
smf_new_profiles () {
[[ "$bfu_isa" = "sparc" ]] || return 0
[[ -x /tmp/bfubin/svccfg ]] || return 0
print "Clearing platform profile hash ..."
# platform_SUNW,Sun-Fire.xml (and other new and
# corrected platforms) were delivered in Build 68.
if [ ! -f \
$rootprefix/var/svc/profile/platform_SUNW,Sun-Fire.xml \
]; then
for pfx in " " "v"; do
for plname in \
none \
SUNW_Sun_Fire_880 \
SUNW_Sun_Fire_V890 \
SUNW_Sun_Fire_15000 \
SUNW_UltraEnterprise_10000; do
svccfg -f - <<EOF
select smf/manifest
delpg ${pfx}ar_svc_profile_platform_${plname}_xml
exit
EOF
done
done
fi
}
smf_handle_new_services () {
#
# Detect, prior to extraction the arrival of new,
# default-enabled-in-profile services. If so, add a command
# such that they are enabled.
#
if [ ! -f $rootprefix/var/svc/profile/system/sac.xml ]; then
echo /usr/sbin/svcadm enable system/sac >> \
$rootprefix/var/svc/profile/upgrade
fi
if [[ $zone = global &&
! -f $rootprefix/var/svc/manifest/system/intrd.xml ]]; then
echo /usr/sbin/svcadm enable system/intrd >> \
$rootprefix/var/svc/profile/upgrade
fi
if [[ $zone = global &&
! -f $rootprefix/var/svc/manifest/system/scheduler.xml ]]; then
echo /usr/sbin/svcadm enable system/scheduler >> \
$rootprefix/var/svc/profile/upgrade
fi
if [[ $zone = global &&
! -f $rootprefix/var/svc/manifest/system/hal.xml ]]; then
echo /usr/sbin/svcadm enable system/hal >> \
$rootprefix/var/svc/profile/upgrade
fi
if [[ $zone = global &&
! -f $rootprefix/var/svc/manifest/system/filesystem/rmvolmgr.xml ]]; then
echo /usr/sbin/svcadm enable system/filesystem/rmvolmgr >> \
$rootprefix/var/svc/profile/upgrade
fi
if [[ $zone = global &&
! -f $rootprefix/var/svc/manifest/network/ipsec/manual-key.xml &&
-f $rootprefix/etc/inet/secret/ipseckeys ]]; then
smf_enable svc:/network/ipsec/manual-key:default
fi
if [[ $zone = global &&
! -f $rootprefix/var/svc/manifest/network/ipsec/ike.xml &&
-f $rootprefix/etc/inet/ike/config ]]; then
smf_enable svc:/network/ipsec/ike:default
fi
if [[ $zone = global &&
! -f $rootprefix/var/svc/manifest/system/pools.xml &&
-f $rootprefix/etc/pooladm.conf ]]; then
smf_enable svc:/system/pools:default
fi
}
smf_copy_manifest() {
mfstbase=`basename $1`
mymfs=$rootprefix/var/svc/manifest/$2/$mfstbase
if [[ ! -f $mymfs ]] || ! cmp -s $manifest_src/$1 $mymfs ; then
cp $manifest_src/$1 $mymfs ||
echo "bfu: could not copy $manifest_src/$1"
fi
}
smf_copy_method() {
cp $manifest_src/$1 $rootprefix/lib/svc/method ||
echo "bfu: could not copy $manifest_src/$1"
}
smf_cleanup_initd() {
rm -f $rootprefix/etc/rc?.d/[SK]??$1
}
smf_delete_manifest() {
(
mfst=$1
cd $root
[[ -f $mfst ]] || return;
if [ -r /etc/svc/volatile/repository_door ]; then
ENTITIES=`/tmp/bfubin/svccfg inventory $mfst`
for fmri in $ENTITIES; do
if [[ -n $root && $root != "/" ]]; then
SVCCFG_REPOSITORY=$root/etc/svc/repository.db
export SVCCFG_REPOSITORY
fi
/tmp/bfubin/svccfg delete -f $fmri >/dev/null 2>&1
if [[ -n $root && $root != "/" ]]; then
unset SVCCFG_REPOSITORY
fi
done
fi
rm $mfst
)
}
smf_delete_methods() {
(
cd $root;
rm -f $smf_obsolete_methods
)
}
smf_delete_renamed_manifests() {
(
cd $root;
rm -f $smf_renamed_manifests
)
}
smf_cleanup_dlmgmtd() {
(
#
# Delete the service instance, then refresh all its dependents in the
# cases of alternative root and zones.
#
smf_delete_manifest "var/svc/manifest/network/dlmgmt.xml"
if [[ -n $root && $root != "/" ]]; then
export SVCCFG_REPOSITORY=$root/etc/svc/repository.db
/tmp/bfubin/svccfg -s svc:/network/physical:nwam refresh
/tmp/bfubin/svccfg -s svc:/network/physical:default refresh
/tmp/bfubin/svccfg -s svc:/system/device/local:default refresh
unset SVCCFG_REPOSITORY
fi
cd $root
rm -f lib/svc/method/svc-dlmgmtd
rm -f etc/.dlmgmt_door
rm -f sbin/dlmgmtd
)
}
smf_cleanup_vt() {
(
smf_delete_manifest var/src/manifest/system/vtdaemon.xml
cd $root
rm -f lib/svc/method/vtdaemon
vt_conslogin_instances=`/tmp/bfubin/svcs -o FMRI | \
grep console-login:vt`
for i in $vt_conslogin_instances; do
/tmp/bfubin/svccfg delete -f $i
done
)
}
old_mfst_dir="var/svc/manifest.orig"
new_mfst_dir="var/svc/manifest"
smf_enable() {
echo "svcadm enable $*" >> $rootprefix/var/svc/profile/upgrade
}
smf_check_repository() {
repository=etc/svc/repository.db
[[ -f $rootprefix/$repository ]] || return
print -n "$rootprefix/$repository: " >&2
sqlite="${SQLITEBIN-$GATE/public/bin/$bfu_isa/sqlite}"
[[ -x $sqlite ]] || sqlite=/lib/svc/bin/sqlite
if [[ ! -x $sqlite ]]; then
echo "no sqlite binary: skipped integrity check" >&2
return
fi
rm -f /tmp/bfurepo.db;
cp $rootprefix/$repository /tmp/bfurepo.db
bad_errors=`echo "PRAGMA integrity_check;" |
$sqlite /tmp/bfurepo.db 2>&1 | grep -v '^ok$'`
if [[ $? -eq 0 ]]; then
echo "integrity check failed:" >&2
echo "$bad_errors" >&2
echo >&2
if [[ $force_override = no ]]; then
cat >&2 <<EOF
Reseed the repository (see http://greenline.eng/quickstart.shtml#newrep)
before BFUing (or use the -f flag to force BFU to continue). Re-seeding
will lose all smf(5) customizations.
EOF
echo >&2
exit 2;
else
echo "driving on anyway" >&2
fi
else
echo "passed integrity check" >&2;
fi
}
smf_bkbfu_warning() {
print ""
print "*************************************************************"
print " WARNING: BFU'ing $1 backwards across 5090532."
print " Fixes have been made but the services cannot be refreshed"
print " on the $1's inactive repository. Next boot for the"
print " $1 will probably result in maintenance mode due to"
print " dependency cycles. If so, at the $1's console, run:"
print ""
print " /usr/sbin/svcadm refresh system/sysidtool:system"
print " /usr/sbin/svcadm refresh system/sysidtool:net"
print " /usr/sbin/svcadm clear milestone/single-user"
print " /usr/sbin/svcadm clear system/sysidtool:system"
print " /usr/sbin/svcadm clear system/sysidtool:net"
print ""
print " to resolve."
print " To avoid these problems, reseed the zone's repository."
print " See http://greenline.eng/quickstart.shtml#newrep ."
print " Note: Re-seeding will lose all smf(5) customization."
print "*************************************************************"
print ""
}
smf_is_sysconfig() {
#
# Return success if going to post-5090532, i.e. post-sysconfig bits
#
# By now, we're going to post-smf bits - so multi-user.xml must
# exist (since it was introduced by first SMF putback).
#
# Function return status is return status of last command executed.
# So, no need to check return status from grep below.
grep sysconfig $rootprefix/var/svc/manifest/milestone/multi-user.xml \
>/dev/null 2>&1
}
smf_bkbfu_past_sysconfig() {
#
# Check if bfu'ing back from post-5090532 to pre-5090532 bits.
#
if [[ -f $rootprefix/var/svc/manifest/milestone/sysconfig.xml ]] &&
! smf_is_sysconfig ; then
return 0
fi
return 1
}
smf_bkbfu_repair_sysconfig() {
#
# Perform the necessary corrections when bfu'ing backwards
# from post-5090532 to pre-5090532 bits.
#
# Get the pre-5090532 non-ON manifests, and issue minimal fixes
# to the repository, to enable re-boot.
#
smf_copy_manifest pre-5090532/sysidtool.xml system
if [[ $zone = global && $karch = i86pc ]]; then
smf_copy_manifest pre-5090532/kdmconfig.xml platform/i86pc
fi
#
# Now, remove sysidtool:{system, net}'s dependency on
# single-user and filesystem-local.
#
# If $rootprefix is not empty, this could be the global zone,
# with an alternate root BFU, or a non-global zone. For either
# case, the repository to be updated is not the live one: use
# SVCCFG_REPOSITORY to point to the repository to be updated.
#
# Note that in the alternate-root case, doing this seems better
# than forcing the user to re-seed, or to dis-allow it. The
# issue of svccfg and the repository not matching seems remote,
# given that from initial SMF integration (on10_64) to on10_74,
# there was no mismatch. In the remote possibility that there is a
# mis-match (in the future) causing these calls to be suspect,
# the user is already being advised, via the warning message, to
# reseed the repository in case of trouble. If a mis-match is ever
# introduced, code such as this would have to be fixed, so this
# aspect of the warning is useful only during the interim period.
#
# NOTE that this is not an issue for non-global zones'
# repositories - they couldn't be out-of-sync with
# /tmp/bfubin/svccfg.
#
if [[ -n $rootprefix ]]; then
export SVCCFG_REPOSITORY=$rootprefix/etc/svc/repository.db
if [[ $zone = global ]]; then
smf_bkbfu_warning "alternate root"
else
smf_bkbfu_warning "zone"
fi
fi
#
# Using the newer "-s" option to svccfg in the following is OK
# since its introduction preceded 5090532 (and this routine wouldn't
# be called unless the machine is running post-5090532 bits).
#
/tmp/bfubin/svccfg -s system/sysidtool:net delpg single-user
/tmp/bfubin/svccfg -s system/sysidtool:system delpg single-user
/tmp/bfubin/svccfg -s system/sysidtool:net delpg filesystem_local
/tmp/bfubin/svccfg -s system/sysidtool:system delpg filesystem_local
#
# On a live system, issue the refresh; For alternate root or non-global
# zone, the user was asked to issue the refreshes and "clear"s in the
# message above after a post-bfu reboot.
#
if [[ -z $rootprefix ]]; then
/tmp/bfubin/svcadm refresh system/sysidtool:system \
system/sysidtool:net
fi
#
# Now, reset SVCCFG_REPOSITORY, if it was set
#
[[ -n $rootprefix ]] && unset SVCCFG_REPOSITORY
#
# Remove the sysconfig.xml manifest when going back. So backward
# bfu check continues to work, and all manifests are correct.
#
cat >> $rootprefix/var/svc/profile/upgrade <<-EOF
rm -f /var/svc/manifest/milestone/sysconfig.xml
EOF
}
#
# Return true if $file exists in $archive. $file may also be a pattern.
#
archive_file_exists()
{
archive=$1
file=$2
$ZCAT $cpiodir/${archive}${ZFIX} | cpio -it 2>/dev/null | \
egrep -s "$file"
}
#
# extract one or more files from an archive into a temporary directory
# provided by the caller. The caller is responsible for checking to
# to see whether the desired file or files were extracted
#
# $1 - archive
# $2 - temporary dir
# remaining args: file(s) to be extracted.
#
archive_file_peek() {
compressed_archive=`pwd`/$1
tdir=$2
shift
shift
if [ ! -d $tdir ] ; then
return
fi
(cd $tdir; $ZCAT $compressed_archive | cpio -idmucB $* 2>&1 )
}
#
# If we're no longer delivering the eeprom service, remove it from the system,
# as eeprom -I is removed as well.
#
smf_fix_i86pc_profile () {
mfst="var/svc/manifest/platform/i86pc/eeprom.xml"
profile="var/svc/profile/platform_i86pc.xml"
if [ ! "$karch" = "i86pc" ]; then
return
fi
if ! archive_file_exists generic.root "^$profile"; then
rm -f $rootprefix/$profile
rm -f $rootprefix/var/svc/profile/platform.xml
fi
if [ ! -f $rootprefix/$mfst ]; then
return
fi
if archive_file_exists generic.root "^$mfst"; then
return
fi
rm -f $rootprefix/$mfst
#
# we must disable via svccfg directly, as manifest-import runs after
# this service tries to run
#
[[ -n "$rootprefix" ]] &&
export SVCCFG_REPOSITORY=$rootprefix/etc/svc/repository.db
/tmp/bfubin/svccfg delete -f platform/i86pc/eeprom
[[ -n "$rootprefix" ]] && unset SVCCFG_REPOSITORY
}
#
# If the new system doesn't support the templates DTD extensions
# (due to backwards bfu), the global.xml manifest should be deleted.
#
smf_bkbfu_templates() {
mfst="var/svc/manifest/system/svc/global.xml"
grep "pg_pattern" \
$rootprefix/usr/share/lib/xml/dtd/service_bundle.dtd.1> \
/dev/null 2>&1
if [ $? -eq 1 ]; then
rm -f $rootprefix/$mfst
fi
}
smf_apply_conf () {
#
# Go thru the original manifests and move any that were unchanged
# (or are not system-provided) back to their proper location. This
# will avoid superfluous re-import on reboot, as the inode and mtime
# are both part of the hash.
#
if [ -d $rootprefix/$old_mfst_dir ]; then
for f in `cd $rootprefix/$old_mfst_dir ; find . -type f`
do
old=$rootprefix/$old_mfst_dir/$f
new=$rootprefix/$new_mfst_dir/$f
if [ ! -f $new ]; then
mkdir -m 0755 -p `dirname $new`
mv $old $new
continue
fi
cmp -s $old $new && mv $old $new
done
rm -rf $rootprefix/$old_mfst_dir
fi
if [ -f $rootprefix/etc/init.d/inetd ]; then
#
# BFUing to non-SMF system -- undo our previous changes,
# run an old hack, and skip the remainder of this function.
#
smf_inetd_reenable
smf_tftp_reinstall
# Update inetd.conf only if we find rpc.metad file.
[ -f $usr/sbin/rpc.metad ] &&
inetd_conf_svm_hack
return
fi
#
# At this point, the archive in question is a SMF version. If
# the smf(5) repository does not yet exist, create it by copying
# the appropriate seed repository. Since updating of non-global
# zones only occurs when the live system is bfu'ed, the
# appropriate seed is guaranteed to exist under the /lib
# directory.
#
repository=$rootprefix/etc/svc/repository.db
if [ ! -f $repository ]; then
print "Initializing service configuration repository ..."
if [ $zone = global ]; then
cp $rootprefix/lib/svc/seed/global.db $repository
else
cp /lib/svc/seed/nonglobal.db $repository
fi
chmod 0600 $repository
chown root:sys $repository
fi
print "Removing obsolete smf services ..."
for f in $smf_obsolete_manifests; do
smf_delete_manifest $f
done
smf_delete_methods
smf_delete_renamed_manifests
if [[ $dlmgmtd_status = cleanup ]]; then
smf_cleanup_dlmgmtd
fi
#
# When doing backwards BFU, if the target does not contain
# vtdaemon manifest, delete it and delete all the additional
# console-login service instances which were used to provide
# additional console sessions.
#
if ((! $ZCAT $cpiodir/generic.root$ZFIX | cpio -it 2>/dev/null | \
grep vtdaemon.xml > /dev/null 2>&1) && [ $zone = global ]); then
smf_cleanup_vt
fi
print "Disabling unneeded inetd.conf entries ..."
smf_inetd_disable
smf_tftp_reinstall
print "Connecting platform and name service profiles ..."
rm -f $rootprefix/var/svc/profile/name_service.xml
grep ldap $rootprefix/etc/nsswitch.conf >/dev/null 2>&1
is_ldap=$?
grep nisplus $rootprefix/etc/nsswitch.conf >/dev/null 2>&1
is_nisplus=$?
grep nis $rootprefix/etc/nsswitch.conf >/dev/null 2>&1
is_nis=$?
if [ $is_ldap = 0 ]; then
ns_profile=ns_ldap.xml
elif [ $is_nisplus = 0 ]; then
ns_profile=ns_nisplus.xml
elif [ $is_nis = 0 ]; then
ns_profile=ns_nis.xml
else
ns_profile=ns_files.xml
fi
ln -s $ns_profile $rootprefix/var/svc/profile/name_service.xml
rm -f $rootprefix/var/svc/profile/inetd_services.xml
ln -s inetd_upgrade.xml $rootprefix/var/svc/profile/inetd_services.xml
print "Marking converted services as enabled ..."
[ -f $rootprefix/etc/resolv.conf ] && smf_enable network/dns/client
[ -f $rootprefix/etc/inet/dhcpsvc.conf ] && \
smf_enable network/dhcp-server
# Not concerned about enabling/disabling rcap but will migrate
# configuration parameters if rcap.conf exists
#
if [ -f $rootprefix/etc/rcap.conf ]; then
migrate_rcap_conf
fi
migrate_acctadm_conf
if [ $zone = global ]; then
if [ -f $rootprefix/etc/dfs/dfstab ] &&
grep '^[ ]*[^# ]' $rootprefix/etc/dfs/dfstab \
> /dev/null; then
smf_enable network/nfs/server
fi
else
echo "/usr/sbin/svcadm disable network/nfs/server" >> \
$rootprefix/var/svc/profile/upgrade
fi
[ -f $rootprefix/etc/inet/ntp.conf ] && smf_enable network/ntp
domainname=`cat $rootprefix/etc/defaultdomain 2>/dev/null`
if [ ! -z "$domainname" -a -d $rootprefix/var/yp/$domainname ]; then
smf_enable network/nis/server
# Determining whether we're a NIS master requires
# looking through the maps.
cat >>$rootprefix/var/svc/profile/upgrade <<\_EOF
# Determine whether we are a YP master.
domain=`/usr/bin/domainname`
hostname=`uname -n | cut -d. -f1 | tr '[A-Z]' '[a-z]'`
if [ -x /usr/sbin/makedbm ]; then
if [ -f /var/yp/NISLDAPmapping ]; then
master=`/usr/sbin/makedbm -u /var/yp/\$domain/LDAP_passwd.byname | grep YP_MASTER_NAME | nawk '{ print $2 }'`
else
master=`/usr/sbin/makedbm -u /var/yp/\$domain/passwd.byname | grep YP_MASTER_NAME | nawk '{ print $2 }'`
fi
fi
# If we are the master server, enable appropriate services.
if [ "$master" = "$hostname" -a "$YP_SERVER" = "TRUE" ]; then
/usr/sbin/svcadm enable network/nis/xfr
/usr/sbin/svcadm enable network/nis/passwd
if [ ! -f /var/yp/NISLDAPmapping ]; then
[ -f /var/yp/updaters ] && \
/usr/svc/svcadm enable network/nis/update
fi
fi
_EOF
fi
# Check if mddbs don't exist on the image. If so, disable SVM services.
MDDB_STATUS=1
if [ -f $rootprefix/kernel/drv/md.conf ]; then
sed -e 's/#.*$//' $rootprefix/kernel/drv/md.conf | \
egrep '^[ ]*mddb_bootlist' >/dev/null 2>&1
MDDB_STATUS=$?
fi
if [ $MDDB_STATUS -ne 0 ]; then
for svc in metainit mdmonitor; do
echo "/usr/sbin/svcadm disable system/$svc:default" >> \
$rootprefix/var/svc/profile/upgrade
done
for svc in meta mdcomm metamed metamh; do
echo "/usr/sbin/svcadm disable network/rpc/$svc:default" \
>> $rootprefix/var/svc/profile/upgrade
done
fi
# Workaround inetd's handling of "tcp6/udp6" when no IPv6 interfaces
# are configured.
for svc in meta mdcomm metamed metamh; do
echo "/usr/sbin/inetadm -m network/rpc/$svc:default proto=tcp" \
">/dev/null 2>&1" >> $rootprefix/var/svc/profile/upgrade
done
manifest_src=${MANIFEST_SRC-$GATE/public/smf}
[[ -d $manifest_src ]] ||
manifest_src=${GATE}/public/smf
[[ -d $manifest_src ]] || manifest_src=/net/greenline.eng/meta0/smf
if smf_bkbfu_past_sysconfig ; then
echo "BFU'ing backwards across 5090532! Now repairing..."
smf_bkbfu_repair_sysconfig
fi
#
# If bfu'ing milestone/sysconfig bits or onwards, update the
# corresponding non-ON manifests - sysidtool and kdmconfig.
#
sysidmfst=$rootprefix/var/svc/manifest/system/sysidtool.xml
kdmmfst=$rootprefix/var/svc/manifest/platform/i86pc/kdmconfig.xml
if smf_is_sysconfig ; then
if [[ ! -f $sysidmfst ]]; then
#
# if WOS build on machine is pre-greenline, and
# we're bfu'ing to the sysconfig bits.
#
smf_copy_manifest post-5090532/sysidtool.xml system
if [[ $zone = global ]]; then
smf_copy_method sysidtool-net
smf_copy_method sysidtool-system
fi
echo "Converted system/sysidtool (post-5090532)"
else
#
# If sysidtool.xml already exists, update it
# if necessary. Future updates of sysidtool.xml
# must occur in the dir: $manifest_src/post-5090532
#
smf_copy_manifest post-5090532/sysidtool.xml system
fi
if [[ $zone = global && $karch = i86pc ]]; then
if [[ ! -f $kdmmfst ]]; then
#
# if WOS build on machine is pre-greenline, and
# we're bfu'ing to the sysconfig bits.
#
smf_copy_manifest post-5090532/kdmconfig.xml \
platform/i86pc
smf_copy_method svc-kdmconfig
smf_cleanup_initd kdmconfig
echo "Converted platform/i86pc/kdmconfig"
echo "(post-5090532)"
else
#
# If kdmconfig.xml already exists, update
# it if necessary. Future updates of
# kdmconfig.xml must occur in the dir:
# $manifest_src/post-5090532
#
smf_copy_manifest post-5090532/kdmconfig.xml \
platform/i86pc
fi
fi
else
if [[ ! -f $sysidmfst ]]; then
smf_copy_manifest pre-5090532/sysidtool.xml system
if [[ $zone = global ]]; then
smf_copy_method sysidtool-net
smf_copy_method sysidtool-system
fi
echo "Converted system/sysidtool"
fi
if [[ $zone = global && $karch = i86pc && ! -f $kdmmfst ]];
then
smf_copy_manifest pre-5090532/kdmconfig.xml \
platform/i86pc
smf_copy_method svc-kdmconfig
smf_cleanup_initd kdmconfig
echo "Converted platform/i86pc/kdmconfig"
fi
fi
# If we've still got the old dtlogin manifest delivered by earlier
# versions of bfu, delete it, as it was broken and should have
# never been delivered. A new version delivered by the CDE
# consolidation should be left alone.
if [[ -f $rootprefix/var/svc/manifest/application/dtlogin.xml &&
`grep -c GLXXX \
$rootprefix/var/svc/manifest/application/dtlogin.xml` -gt 0 &&
-x /tmp/bfubin/svccfg ]]; then
# Delete the obsolete manifest.
rm -f $rootprefix/var/svc/manifest/application/dtlogin.xml
# Delete the service from repository, then use dtconfig -e to
# revert to whatever the WOS bits are using if dtlogin was
# enabled.
cat >> $rootprefix/var/svc/profile/upgrade <<-EOFA
if /usr/bin/svcprop -q application/cde-login; then
if [ \`/usr/bin/svcprop -p general/enabled \
application/cde-login:default\` = "true" ]; then
do_dtconfig=1;
else
do_dtconfig=0;
fi
/usr/sbin/svccfg delete -f application/cde-login
type instance_refresh 2>&1 > /dev/null
if [ \$? = 0 ]; then
instance_refresh system/console-login
else
/usr/sbin/svcadm refresh system/console-login
fi
if [ \$do_dtconfig -eq 1 -a -x /usr/dt/bin/dtconfig ]; then
/usr/dt/bin/dtconfig -e
fi
fi
EOFA
fi
# Enable the inetd-upgrade service to convert any changes to inetd.conf
smf_enable network/inetd-upgrade
# If global zone, and bfu'ing from smf, and the inetd-upgrade
# service has an obsolete dependency, then add a clear of inetd
# and inetd-upgrade to the upgrade file as either may drop into
# maintenance due to a dependency loop resulting from the new
# inetd manifest
if [[ $zone = global && -x /tmp/bfubin/svccfg ]]; then
/tmp/bfubin/svcprop -q -p network/entities network/inetd-upgrade
if [[ $? = 0 ]]; then
echo "/usr/sbin/svcadm clear network/inetd" >> \
$rootprefix/var/svc/profile/upgrade
echo "/usr/sbin/svcadm clear network/inetd-upgrade" >> \
$rootprefix/var/svc/profile/upgrade
fi
fi
#
# Import the name-service-cache service. This is to get the service
# (with correct dependencies) in the repository before reboot.
#
smf_import_service system/name-service-cache.xml
#
# Import the datalink-management service.
#
smf_import_service network/dlmgmt.xml \
svc:/network/datalink-management:default
#
# Import the ldap/client service. This is to get the service
# (with correct dependencies) in the repository before reboot.
#
smf_import_service network/ldap/client.xml
# Enable new NFS status and nlockmgr services if client is enabled
cat >> $rootprefix/var/svc/profile/upgrade <<-EOF
cl="svc:/network/nfs/client:default"
if [ \`/usr/bin/svcprop -p general/enabled \$cl\` = "true" ]; then
/usr/sbin/svcadm enable svc:/network/nfs/status:default
/usr/sbin/svcadm enable svc:/network/nfs/nlockmgr:default
fi
EOF
kpmani="$rootprefix/var/svc/manifest/network/security/krb5_prop.xml"
if grep svc-kdc.slave $kpmani > /dev/null 2>&1; then
cat >> $rootprefix/var/svc/profile/upgrade <<EOF
# We are deleting and reimporting kpropd's manifest, because we
# need to change the restarter.
kpfmri="svc:/network/security/krb5_prop"
kkfmri="svc:/network/security/krb5kdc:default"
lkpmani="/var/svc/manifest/network/security/krb5_prop.xml"
restarter=\`svcprop -c -p general/restarter \$kpfmri 2>&1\`
case \$restarter in
*network/inetd:default)
kken=\`svcprop -c -p general/enabled \$kkfmri\`
svccfg delete -f \$kpfmri
svccfg import \$lkpmani
# Enable kpropd if krb5kdc is enabled, since
# krb5kdc would have run kpropd
if [ \$kken = "true" ]; then
svcadm enable \$kpfmri
fi
;;
esac
EOF
fi
# Enable print server if there are local queues
queues=`echo $rootprefix/etc/lp/printers/*/configuration`
if [ "$queues" != "$rootprefix/etc/lp/printers/*/configuration" ]; then
smf_enable application/print/server
fi
# Enable rarpd and bootparamd if they would have been running pre-SMF
if [ -d $rootprefix/tftpboot ] || [ -d $rootprefix/rplboot ]; then
smf_enable network/rarp
smf_enable network/rpc/bootparams
fi
# To handle the transition from pre-smf ipfilter to smf-aware ipfilter,
# check if ipfilter had been enabled with at least one rule, and if so
# enable the smf instance.
if grep '^[ \t]*[^# \t]' $rootprefix/etc/ipf/ipf.conf >/dev/null 2>&1 &&
[[ $zone = global ]]; then
smf_enable network/ipfilter
fi
touch $rootprefix/var/svc/profile/.upgrade_prophist
cat >> $rootprefix/var/svc/profile/upgrade <<EOF
# We are deleting and reimporting dcs's manifest, because we
# need to change the restarter.
dcsfmri="svc:/platform/sun4u/dcs:default"
dcsmani="/var/svc/manifest/platform/sun4u/dcs.xml"
restarter=\`svcprop -c -p general/restarter \$dcsfmri 2>&1\`
case \$restarter in
*network/inetd:default)
en=\`svcprop -c -p general/enabled \$dcsfmri\`
svccfg delete -f \$dcsfmri
svccfg import \$dcsmani
if [ \$en = "true" ]; then
svcadm enable \$dcsfmri
fi
;;
esac
EOF
smf_fix_i86pc_profile
smf_bkbfu_templates
}
tx_check_update() {
#
# If a lbl_edition file is found it's a likely sign that old unbundled
# Trusted Extensions packages are installed and TX is active. Update
# etc/system if needed, to complete enabling of the bundled TX.
#
LMOD1=$rootprefix/kernel/sys/lbl_edition
LMOD2=$rootprefix/kernel/sys/amd64/lbl_edition
LMOD3=$rootprefix/kernel/sys/sparcv9/lbl_edition
grep "^set sys_labeling=" $rootprefix/bfu.child/etc/system > \
/dev/null 2>&1
if [ $? -eq 0 ]; then
return
fi
if [ -f $LMOD1 -o -f $LMOD2 -o -f $LMOD3 ]; then
echo "set sys_labeling=1" >> $rootprefix/bfu.child/etc/system
if [ $? -ne 0 ]; then
echo "cannot set sys_labeling in $rootprefix/bfu.child/etc/system"
return
fi
rm -f $LMOD1 $LMOD2 $LMOD3
fi
}
tx_check_bkbfu() {
#
# Emit a warning message if bfu'ing a Trusted Extensions-enabled system
# backwards to pre TX-merge bits. In this case, unbundled packages must
# be reinstalled to complete restoration of old TX bits.
#
bsmconv=$rootprefix/etc/security/bsmconv
# This check is only needed in global zone
if [[ $zone != global ]]; then
return
fi
# No warning needed if TX is not currently enabled
grep "^set sys_labeling=" $rootprefix/bfu.child/etc/system > \
/dev/null 2>&1
if [ $? -ne 0 ]; then
return
fi
if [ ! -f $bsmconv ]; then
return
fi
grep " -x /usr/bin/plabel " $bsmconv > /dev/null 2>&1
if [ $? != 0 ]; then
return
fi
print ""
print "*************************************************************"
print " WARNING: BFU'ing TX backwards across 6533113."
print " Must re-install unbundled TX packages to remain Trusted."
print "*************************************************************"
print ""
}
#
# The directboot putback moved the console property from
# /boot/solaris/bootenv.rc to /boot/grub/menu.lst. It should be kept in both.
#
cleanup_eeprom_console()
{
bootenvrc="$root/boot/solaris/bootenv.rc"
menu_console=`eeprom console 2>/dev/null | \
grep -v 'data not available' | cut -d= -f2-`
bootenv_console=`grep '^setprop[ ]\{1,\}console\>' $bootenvrc`
if [ -n "$menu_console" ] && [ -z "$bootenv_console" ]; then
echo "setprop console '$menu_console'" >> $bootenvrc
fi
}
EXTRACT_LOG=/tmp/bfu-extract-log.$$
rm -f $EXTRACT_LOG
extraction_error() {
echo error $* >> $EXTRACT_LOG
}
#
# Make a local copy of bfu in /tmp and execute that instead.
# This makes us immune to loss of networking and/or changes
# to the original copy that might occur during execution.
#
cd .
abspath=`[[ $0 = /* ]] && print $0 || print $PWD/$0`
if [[ $abspath != /tmp/* ]]; then
localpath=/tmp/bfu.$$
print "Copying $abspath to $localpath"
cp $abspath $localpath
chmod +x $localpath
print "Executing $localpath $*\n"
exec $localpath $*
fi
export PATH=/usr/bin:/usr/sbin:/sbin
usage() {
echo "Usage:"
echo " bfu [-fh] <archive_dir> [root-dir]"
echo "\tUpdate a single machine by loading archives on root-dir."
echo "\troot-dir defaults to / (a live bfu).\n"
echo " bfu -c [-fh] <archive_dir> <exec-dir>"
echo "\tUpdate all diskless clients by loading archives on each client"
echo "\tthat mounts exec-dir as /usr. <exec-dir> must start with"
echo "\t/export/exec and each client's root must be in /export/root.\n"
echo "\t-f force bfu to continue even if it doesn't seem safe"
fail "\t-h|-help print this usage message and exit\n"
}
diskless=no
force_override=no
while [ $# -gt 0 ]; do
case $1 in
-c) diskless=yes;;
-f) force_override=yes;;
-h|-help) usage;;
*) break;;
esac
shift
done
# Variables for x86 platforms
boot_is_pcfs=no
have_realmode=no
is_pcfs_boot=no
new_dladm=no
# Set when moving to either directboot or multiboot
multi_or_direct=no
#
# Shows which type of archives we have, which type of system we are
# running on (before the bfu), and what the failsafe archives are
# (again, before the bfu). failsafe_type is only needed on diskful
# bfu's, so it's not set in the diskless case.
# Possible values: unknown, dca, multiboot, directboot, xpv
#
archive_type=unknown
system_type=unknown
failsafe_type=unknown
test $# -ge 1 || usage
if [ -x /usr/bin/ppriv ]; then
# We prefer to use ppriv, as it is a more accurate test, and also
# has the benefit of preventing use from within a nonglobal zone.
ppriv $$ | grep -w "E: all" > /dev/null 2>&1 || \
fail "bfu requires all privileges"
else
# Fall back to old id check if system does not yet have ppriv.
uid=`id | nawk '{print $1}'`
[ "$uid" = "uid=0(root)" ] || \
fail "You must be super-user to run this script."
fi
bfu_isa=`uname -p`
target_isa=$bfu_isa
karch=`uname -m`
plat=`uname -i`
cpiodir=$1
if [ "$cpiodir" = again ]; then
cpiodir=`nawk '/^bfu.ed from / { print $3; exit }' /etc/motd`
fi
[[ "$cpiodir" = */* ]] || cpiodir=$ARCHIVE/archives/$target_isa/$1
[[ "$cpiodir" = /* ]] || fail "archive-dir must be an absolute path"
cd $cpiodir
case `echo generic.root*` in
generic.root) ZFIX=""; ZCAT="cat";;
generic.root.gz) ZFIX=".gz"; ZCAT="gzip -d -c";;
generic.root.Z) ZFIX=".Z"; ZCAT="zcat";;
*) fail "generic.root missing or in unknown compression format";;
esac
#
# Determine what kind of archives we're installing, using the following rules:
#
# 1. If i86xpv archives exist, the archives are xpv
# 2. If strap.com is present, the archives are pre-multiboot
# 3. If symdef is present, the archives are directboot
# 4. Otherwise, the archives are multiboot
#
if [ $target_isa = i386 ]; then
if [ -f $cpiodir/i86xpv.root$ZFIX ]; then
archive_type=xpv
multi_or_direct=yes
elif [ -f $cpiodir/i86pc.boot$ZFIX ] && \
archive_file_exists i86pc.boot "strap.com"; then
archive_type=dca
elif [ -f $cpiodir/i86pc.root$ZFIX ] && \
archive_file_exists i86pc.boot symdef; then
archive_type=directboot
multi_or_direct=yes
else
archive_type=multiboot
multi_or_direct=yes
fi
fi
if [ $diskless = no ]; then
root=${2:-/}
[[ "$root" = /* ]] || fail "root-dir must be an absolute path"
usrroot=$root
usr=${usrroot%/}/usr
rootlist=$root
[[ -f $root/etc/system ]] || \
fail "$root/etc/system not found; nonglobal zone target not allowed"
rootfstype=`df -n $root | awk '{print $3}'`
if [ "$rootfstype" = "zfs" ]; then
archive_has_zfs_root_support=no
mkdir /tmp/zfschk.$$
archive_file_peek generic.lib /tmp/zfschk.$$ \
"lib/svc/share/fs_include.sh"
if [ -f /tmp/zfschk.$$/lib/svc/share/fs_include.sh ] ; then
if grep '^readswapdev' \
/tmp/zfschk.$$/lib/svc/share/fs_include.sh \
>/dev/null 2>&1 ; then
archive_has_zfs_root_support=yes
fi
fi
rm -fr /tmp/zfschk.$$
if [ "$archive_has_zfs_root_support" = "no" ] ; then
fail "Cannot bfu a system with zfs root to an archive with no zfs root support"
fi
fi
# Make sure we extract the sun4u-us3 libc_psr.so.1
if [ -d $root/platform/sun4u -a \
! -d $root/platform/sun4u-us3 ]
then
mkdir $root/platform/sun4u-us3
chmod 755 $root/platform/sun4u-us3
chown root $root/platform/sun4u-us3
chgrp sys $root/platform/sun4u-us3
fi
if [ $target_isa = i386 ]; then
if [ $archive_type = xpv ]; then
#
# On i386, we want to apply the archives for both
# platforms (i86pc and i86xpv) if they exist. We
# force the platform to i86xpv so that both will be
# applied.
#
karch=i86pc
plat=i86xpv
fi
if [ ! -d $root/platform/i86hvm ]; then
mkdir $root/platform/i86hvm
fi
fi
if [ $karch != $plat -a -f ${cpiodir}/${plat}.usr$ZFIX ]; then
usrarchs="$karch $plat"
else
usrarchs="$karch"
fi
if [ $karch != $plat -a -f ${cpiodir}/${plat}.root$ZFIX ]; then
rootarchs="$karch $plat"
else
rootarchs="$karch"
fi
if [ -h ${root}/platform/${plat} ]; then
rm -f ${root}/platform/${plat}
fi
if [ -h ${usr}/platform/${plat} ]; then
rm -f ${usr}/platform/${plat}
fi
if [ $plat != $karch -a -f ${cpiodir}/${plat}.root$ZFIX \
-a -f ${cpiodir}/${plat}.usr$ZFIX ]
then
cd $cpiodir
#
# Look through all the archives we build and match
# the names of built archives with the names of
# directories installed on this machine. We assume
# here that we can get the names of all architectures
# by pattern matching the names of .root archives - so
# if we ever had a case where we had only a .usr archive
# we wouldn't find that archive.
#
for i in *.root*
do
platname=${i%.root*}
if [ -z "${platname}" -o ${platname} = $karch -o \
$platname = generic -o ${platname} = $plat ]; then
continue;
fi
if [ -d ${root}/platform/${platname} -o \
-h ${root}/platform/${platname} ]; then
rootarchs="${rootarchs} ${platname}"
fi
if [ -d ${usr}/platform/${platname} -o \
-h ${usr}/platform/${platname} ]; then
usrarchs="${usrarchs} ${platname}"
fi
if [ -h ${root}/platform/${platname} ]; then
rm -f ${root}/platform/${platname}
fi
if [ -h ${usr}/platform/${platname} ]; then
rm -f ${usr}/platform/${platname}
fi
done
fi
if [ "$rootfstype" = "ufs" ] ; then
rootslice=`df -k $root | nawk 'NR > 1 { print $1 }' | \
sed s/dsk/rdsk/`
fi
print "Loading $cpiodir on $root"
else
usrroot=$2
usr=$2/usr
[[ "$usr" = /export/exec/* ]] || fail "exec-dir $usrroot sounds bogus"
case $2 in
*sparc*)
target_isa=sparc ;;
*i386*)
target_isa=i386 ;;
esac
cd $cpiodir
test -f generic.root$ZFIX || fail "$cpiodir/generic.root$ZFIX missing"
allarchs=$(echo $(ls *.root$ZFIX | grep -v generic.root$ZFIX | \
sed -e 's/.root.*//'))
if [ $target_isa = i386 -a $archive_type = xpv ]; then
#
# On i386, we want to apply the archives for both platforms
# (i86pc and i86xpv) if they exist. We force the platform
# to i86xpv so that both will be applied.
#
karch=i86pc
plat=i86xpv
else
# XXX Pick karch as last available root arch
karch=${allarchs##* }
# XXX Pick plat as first available root arch
plat=${allarchs%% *}
fi
rootlist=""
for root in /export/root/*
do
test -f $root/etc/vfstab &&
egrep -s $usrroot $root/etc/vfstab &&
rootlist="$rootlist $root"
done
test -n "$rootlist" || fail "no clients to upgrade"
print "Loading $cpiodir usr archives on:\n\t$usr\n"
print "Loading $cpiodir root archives on:"
for root in $rootlist
do
print "\t$root"
done
fi
if grep '^[ ]*zfsroot:' $root/etc/system >/dev/null && \
archive_file_exists i86pc.boot boot/grub/zfs_stage1_5; then
echo "Cannot BFU a system with the mountroot version"\
"of zfs boot support."
echo "For information on how to transition this system to the new"
echo "zfs boot support, see:"
echo "http://www.opensolaris.org/os/community/zfs/boot/zfsboot-manual/mntroot-transition/"
fail ""
fi
nss_lib="$usr/lib/mps/libnss3.so"
nss_lib64="$usr/lib/mps/64/libnss3.so"
valid_rpath="\$ORIGIN:/usr/lib/mps/secv1:/usr/lib/mps"
rpath_msg="R(UN)?PATH from file ${nss_lib}\)"
if [ ! -x /usr/bin/ldd ]; then
if [ "$force_override" = yes ]; then
echo "/usr/bin/ldd is missing but -f is set; continuing."
else
echo "/usr/bin/ldd is missing."
fail "Install the SUNWtoo package."
fi
fi
nss_rpath=`ldd -s $nss_lib | egrep "$rpath_msg" | head -1 | cut -d'=' -f2 | \
awk '{print $1}'`
update_script="${GATE}/public/bin/update_nsspkgs"
if [ $valid_rpath != "$nss_rpath" ]; then
if [ "$force_override" = yes ]; then
echo "$nss_lib is not valid but -f is set; continuing."
else
echo "$nss_lib is not valid."
fail "Run $update_script to update the SUNWtls package."
fi
fi
if [ $target_isa = i386 -a ! -f $nss_lib64 ]; then
echo "$nss_lib64 does not exist."
fail "Run $update_script to update the NSS packages."
fi
update_script="${GATE}/public/bin/migrate_bind9"
if [[ ! -f $usr/lib/dns/libdns.so ]] && ! $ZCAT $cpiodir/generic.usr$ZFIX | \
cpio -it 2>/dev/null | egrep -s '^usr/sbin/ndc' ; then
if [ "$force_override" = yes ]; then
echo "BIND 9 has not been installed, but -f is set; continuing."
else
echo "BIND 8 has been removed from ON; BIND 9 is available from SFW."
fail "Run $update_script to migrate to BIND 9."
fi
fi
update_script="${GATE}/public/bin/update_ce"
if ifconfig -a | egrep '^ce' >/dev/null 2>/dev/null; then
# CE version 1.148 or later is required
cever=`modinfo | grep 'CE Ethernet' | sed 's/.*v1\.//' | tr -d ')' | \
nawk '{ if ($1 < 148) print "BAD"; else print $1 }'`
if [ "$cever" = "BAD" ]; then
fail "You must run $update_script to upgrade your ce driver."
fi
fi
update_script="${GATE}/public/bin/update_dbus"
if [ ! -x $usr/lib/dbus-daemon ]; then
fail "Run $update_script to update D-Bus."
fi
#
# We need biosdev if we're moving from pre-multiboot to multiboot or directboot
# kernels. If we already have an i86xpv kernel, then we must already be a
# directboot kernel, and can therefore skip the check.
#
if [ $target_isa = i386 ] && [ $multi_or_direct = yes ] && \
[ $diskless = no ] && [ ! -d /platform/i86xpv/ ]; then
prtconf -v | grep biosdev >/dev/null 2>&1
if [ $? -ne 0 ] && [ ! -f $rootprefix/platform/i86pc/multiboot ]; then
echo "biosdev cannot be run on this machine."
echo "Transitioning from classic to multiboot requires a"
echo "bootconf which is compatible with biosdev."
echo "bfu to onnv_12 first, then to a build with multiboot."
fail ""
fi
fi
#
# Check whether the archives have a datalink-management services; this is
# later used to determine whether we need to upgrade the existing datalink
# configuration and if the datalink-management service needs to be removed.
#
if archive_file_exists generic.sbin "sbin/dlmgmtd"; then
dlmgmtd_exists=true
else
dlmgmtd_exists=false
fi
#
# Set the value of dlmgmtd_status based on the existence of the
# /sbin/dlmgmtd file
#
dlmgmtd_status=none
if [[ -f $root/sbin/dlmgmtd ]] && ! $dlmgmtd_exists ; then
dlmgmtd_status=cleanup
elif [[ ! -f $root/sbin/dlmgmtd ]] && $dlmgmtd_exists ; then
dlmgmtd_status=new
fi
#
# Check whether the archives have an etc/dladm directory; this is
# later used to determine if aggregation.conf needs to be moved.
#
if $ZCAT $cpiodir/generic.root$ZFIX | cpio -it 2>/dev/null | \
grep etc/dladm > /dev/null 2>&1 ; then
new_dladm=yes
fi
#
# Check whether the build is boot-archive or ufsboot sparc
# boot based on the existence of a generic.boot archive
#
newboot_sparc=no
if [ $target_isa = sparc -a -f $cpiodir/generic.boot$ZFIX ]; then
newboot_sparc=yes
fi
time_ref=/tmp/bfu.time_ref.$$
rm -f $time_ref
touch $time_ref || fail "$time_ref: Unable to create time reference."
time_ref_seconds=$SECONDS
print "\nCreating bfu execution environment ..."
#
# Save off a few critical libraries and commands, so that bfu will
# continue to function properly even in the face of major
# kernel/library/command incompatibilities during a live upgrade.
#
bfucmd="
/usr/bin/awk
/usr/bin/cat
/usr/bin/chgrp
/usr/bin/chmod
/usr/bin/chown
/usr/bin/cmp
/usr/bin/cp
/usr/bin/cpio
/usr/bin/csh
/usr/bin/cut
/usr/bin/date
/usr/bin/dd
/usr/bin/df
/usr/bin/diff
/usr/bin/du
/usr/bin/echo
/usr/bin/ed
/usr/bin/egrep
/usr/bin/env
/usr/bin/ex
/usr/bin/expr
/usr/bin/false
/usr/bin/fgrep
/usr/bin/file
/usr/bin/find
/usr/bin/gettext
/usr/bin/grep
/usr/bin/head
/usr/bin/id
/usr/bin/ksh
/usr/bin/line
/usr/bin/ln
/usr/bin/ls
/usr/bin/mkdir
/usr/bin/mktemp
/usr/bin/more
/usr/bin/mv
/usr/bin/nawk
/usr/bin/pgrep
/usr/bin/pkginfo
/usr/bin/pkill
/usr/bin/printf
/usr/bin/ps
/usr/bin/ptree
/usr/bin/rm
/usr/bin/rmdir
/usr/bin/sed
/usr/bin/sh
/usr/bin/sleep
/usr/bin/sort
/usr/bin/strings
/usr/bin/stty
/usr/bin/su
/usr/bin/sum
/usr/bin/tail
/usr/bin/tee
/usr/bin/touch
/usr/bin/tr
/usr/bin/true
/usr/bin/truss
/usr/bin/tty
/usr/bin/uname
/usr/bin/uniq
/usr/bin/uptime
/usr/bin/vi
/usr/bin/w
/usr/bin/wc
/usr/bin/xargs
/usr/bin/zcat
/usr/sbin/add_drv
/usr/sbin/chroot
/usr/sbin/halt
/usr/sbin/lockfs
/usr/sbin/lofiadm
/usr/sbin/mkfile
/usr/sbin/mkfs
/usr/sbin/mknod
/usr/sbin/mount
/usr/sbin/newfs
/usr/sbin/pkgrm
/usr/sbin/prtconf
/usr/sbin/reboot
/usr/sbin/sync
/usr/sbin/tar
/usr/sbin/uadmin
/usr/sbin/umount
/usr/sbin/update_drv
/usr/sbin/wall
/usr/sbin/zonecfg
${FASTFS-$GATE/public/bin/$bfu_isa/fastfs}
${GZIPBIN-$GATE/public/bin/$bfu_isa/gzip}
"
#
# Scripts needed by BFU. These must be modified to use the interpreters in
# /tmp/bfubin. The interpreters in /usr/bin may not be compatible with the
# libraries in the archives being extracted.
#
bfuscr="
${ACR-${GATE}/public/bin/acr}
"
#
# basename and dirname may be ELF executables, not shell scripts;
# make sure they go into the right list.
#
if `file /usr/bin/basename | grep ELF >/dev/null`
then bfucmd="$bfucmd /usr/bin/basename"
else bfuscr="$bfuscr /usr/bin/basename"
fi
if `file /usr/bin/dirname | grep ELF >/dev/null`
then bfucmd="$bfucmd /usr/bin/dirname"
else bfuscr="$bfuscr /usr/bin/dirname"
fi
rm -rf /tmp/bfubin
mkdir /tmp/bfubin
set $bfucmd
isalist=`isalist`
while [ $# -gt 0 ]
do
dir=${1%/*}
cmd=${1##*/}
cd $dir
isacmd=`(find $isalist -name $cmd 2>/dev/null; echo $cmd) | head -1`
cp $dir/$isacmd /tmp/bfubin || fail "cannot copy $dir/$isacmd"
shift
done
#
# Optional commands. We warn, but do not abort, if we are crossing a
# feature boundary (where a command is not present in the parent).
# Clauses requiring these commands must explicitly test for their
# presence in /tmp/bfubin.
#
bfuoptcmd="
/sbin/biosdev
/sbin/bootadm
/sbin/installgrub
/usr/sbin/fdisk
/usr/sbin/metastat
/usr/bin/mkisofs
/usr/sbin/svcadm
/usr/sbin/svccfg
/usr/bin/svcprop
/usr/bin/svcs
"
set $bfuoptcmd
isalist=`isalist`
while [ $# -gt 0 ]
do
dir=${1%/*}
cmd=${1##*/}
cd $dir
isacmd=`(find $isalist -name $cmd 2>/dev/null; echo $cmd) | head -1`
cp $dir/$isacmd /tmp/bfubin 2>/dev/null
shift
done
#
# set up installgrub and friends if transitioning to multiboot or directboot
# do this now so ldd can determine library dependencies
#
# We split the binaries into two groups: the type where we want to make any
# effort to get the newest version (like symdef and bootadm), and the type
# where any old version will do (like installgrub and biosdev).
#
# If we're bfu'ing across the directboot/multiboot boundary, we need the new
# bootadm and symdef to properly handle menu.lst changes. If the system is
# directboot, we can use the local copies. If the system is multiboot but
# the archives are directboot, we extract the binaries early. Otherwise,
# we're not crossing the boundary, and which one we use doesn't matter.
#
# NB - if bootadm or symdef is ever changed to require a new library, the
# early extraction will blow up horribly.
#
# For testing purposes, a user can set DIRECTBOOT_BIN_DIR in the environment,
# and we'll use that instead.
#
MULTIBOOT_BIN_DIR=${MULTIBOOT_BIN_DIR:=${GATE}/public/multiboot}
have_new_bootadm=unknown
if [ -f "$root/platform/i86xpv/kernel/unix" ]; then
root_is_xpv=yes
root_is_directboot=yes
elif [ -x "$root/boot/solaris/bin/symdef" ] && \
"$root"/boot/solaris/bin/symdef "$root/platform/i86pc/kernel/unix" \
dboot_image; then
root_is_xpv=no
root_is_directboot=yes
else
root_is_xpv=no
root_is_directboot=no
fi
#
# A comma-separated list of the command and the archive it's in
#
multiboot_new_cmds="
sbin/bootadm,generic.sbin
boot/solaris/bin/symdef,i86pc.boot
"
if [ $multi_or_direct = yes ]; then
for line in $multiboot_new_cmds
do
cmd=${line%,*}
file=${cmd##*/}
archive=${line#*,}
if [ -n "$DIRECTBOOT_BIN_DIR" ] && \
[ -f $DIRECTBOOT_BIN_DIR/$file ]; then
cp $DIRECTBOOT_BIN_DIR/$file /tmp/bfubin/
else
if [[ $root_is_xpv = yes ||
$root_is_directboot = yes &&
$archive_type = multiboot ]]; then
cp $root/$cmd /tmp/bfubin/
have_new_bootadm=yes
elif [ $archive_type = directboot ] || \
[ $archive_type = xpv ]; then
DBOOT_TMPDIR=/tmp/dboot.$$
trap "rm -rf $DBOOT_TMPDIR" EXIT
OLD_PWD=$(pwd)
rm -rf $DBOOT_TMPDIR
mkdir $DBOOT_TMPDIR
cd $DBOOT_TMPDIR
$ZCAT $cpiodir/${archive}$ZFIX | \
cpio -id "$cmd" 2>/dev/null
if [ -x $cmd ]; then
cp $cmd /tmp/bfubin/
have_new_bootadm=yes
fi
cd $OLD_PWD
rm -rf $DBOOT_TMPDIR
trap - EXIT
fi
fi
#
# If all else fails, grab the local version
#
if [ ! -x /tmp/bfubin/$file ]; then
[ -x /$cmd ] && cp /$cmd /tmp/bfubin
fi
done
if [ $archive_type = directboot ] && [ $root_is_directboot = yes ]; then
cleanup_eeprom_console
fi
fi
multiboot_cmds="
/sbin/biosdev
/sbin/installgrub
"
copying_mboot_cmds=no
if [ $multi_or_direct = yes ]; then
for cmd in $multiboot_cmds
do
file=`basename $cmd`
if [ -f $cmd ]; then
cp $cmd /tmp/bfubin
elif [ -n "$DIRECTBOOT_BIN_DIR" ] &&
[ -d $DIRECTBOOT_BIN_DIR ] &&
[ -x $DIRECTBOOT_BIN_DIR/$file ]; then
cp $DIRECTBOOT_BIN_DIR/$file /tmp/bfubin/
else
if [ ! -d $MULTIBOOT_BIN_DIR ]; then
echo "$MULTIBOOT_BIN_DIR: not found"
elif [ ! -f $MULTIBOOT_BIN_DIR/$file ]; then
echo "$MULTIBOOT_BIN_DIR/$file: not found"
fi
if [ $copying_mboot_cmds = no ]; then
echo "installing files from $MULTIBOOT_BIN_DIR"
copying_mboot_cmds=yes
fi
cp $MULTIBOOT_BIN_DIR/$file /tmp/bfubin
fi
done
fi
#
# If available, use ldd to determine which libraries bfu depends on.
# Otherwise, just make an educated guess.
#
if [ -x /usr/bin/ldd ]; then
bfulib="`ldd /tmp/bfubin/* | nawk '$3 ~ /lib/ { print $3 }' | sort -u`"
else
bfulib="
/lib/libc.so.1
/lib/libm.so.2
/lib/libdoor.so.1
/lib/libm.so.2
/lib/libmd.so.1
/lib/libmd5.so.1
/lib/libnvpair.so.1
/lib/libscf.so.1
/lib/libuutil.so.1
/usr/lib/libbsm.so.1
/usr/lib/libc2.so
/usr/lib/libdl.so.1
/usr/lib/libelf.so.1
/usr/lib/libkstat.so.1
/usr/lib/libmapmalloc.so.1
/usr/lib/libmp.so.1
/usr/lib/libnsl.so.1
/usr/lib/libpam.so.1
/usr/lib/libsec.so.1
/usr/lib/libsocket.so.1
/usr/lib/libtecla.so.1
"
fi
# add dlopen()'ed stuff
bfulib="
$bfulib
/lib/ld.so.1
/usr/lib/nss_*
"
# add libc_psr.so.1, if available and not empty
if [ -s /platform/`uname -i`/lib/libc_psr.so.1 ]; then
bfulib="
$bfulib
/platform/`uname -i`/lib/libc_psr.so.1
"
fi
rm -rf /tmp/bfulib /tmp/bl
mkdir /tmp/bfulib /tmp/bl
#
# Create 64 bit directory structure and determine 64 bit arch name.
#
if [ -h /usr/lib/64 ]
then
link=`ls -dl /usr/lib/64 | awk '{print $NF}'`
ln -s $link /tmp/bfulib/64
ln -s $link /tmp/bl/64
mkdir /tmp/bfulib/$link /tmp/bl/$link
bfulib="$bfulib /usr/lib/64/nss_*"
#
# Copy libraries to proper directories
#
for lib in $bfulib
do
case $lib in
*/64/* | */$link/*)
cp $lib /tmp/bfulib/64;;
*)
cp $lib /tmp/bfulib;;
esac
done
#
# Private 64 bit runtime linker.
#
cp /lib/64/ld.so.1 /tmp/bfulib/64/bf.1
cp /lib/64/ld.so.1 /tmp/bl/64/bf.1
else
cp $bfulib /tmp/bfulib
fi
cp /lib/ld.so.1 /tmp/bfulib/bf.1 # bfu's private runtime linker
cp /lib/ld.so.1 /tmp/bl/bf.1
${BFULD-$GATE/public/bin/$bfu_isa/bfuld} /tmp/bfubin/* || fail "bfuld failed"
for x in $bfuscr
do
sed -e 's/\/usr\/bin\//\/tmp\/bfubin\//g' \
-e 's/\/bin\//\/tmp\/bfubin\//g' < $x > /tmp/bfubin/`basename $x`
chmod +x /tmp/bfubin/`basename $x`
done
#
# scripts used together with multiboot
#
multiboot_scr="
/boot/solaris/bin/create_ramdisk
/boot/solaris/bin/create_diskmap
/boot/solaris/bin/root_archive
"
if [ $multi_or_direct = yes ]; then
for cmd in $multiboot_scr
do
file=`basename $cmd`
if [ -f $cmd ]; then
cp $cmd /tmp/bfubin
else
if [ ! -d $MULTIBOOT_BIN_DIR ]; then
echo "$MULTIBOOT_BIN_DIR: not found"
fail ""
fi
if [ ! -f $MULTIBOOT_BIN_DIR/$file ]; then
echo "$MULTIBOOT_BIN_DIR/$file: not found"
fail ""
fi
echo "copying $file from $MULTIBOOT_BIN_DIR"
cp $MULTIBOOT_BIN_DIR/$file /tmp/bfubin
fi
#
# We do two substitutions here to replace references to
# both /usr/bin/ and /bin/ with /tmp/bfubin/
#
mv /tmp/bfubin/${file} /tmp/bfubin/${file}-
sed -e 's/\/usr\/bin\//\/tmp\/bfubin\//g' \
-e 's/\/bin\//\/tmp\/bfubin\//g' \
< /tmp/bfubin/${file}- > /tmp/bfubin/${file}
chmod +x /tmp/bfubin/${file}
done
fi
#
# For directboot archives, /boot/platform/i86pc/kernel/unix will be
# overwritten, which could cause a mis-match with the failsafe
# miniroot. Extract unix from the miniroot and save it off for now.
#
if [ $archive_type = directboot ] && [ $diskless = no ]; then
if gunzip -c "$root/boot/x86.miniroot-safe" \
>/tmp/bfubin/miniroot-unzipped; then
lofifile=/tmp/bfubin/miniroot-unzipped
else
# Shouldn't happen? See if someone already unzipped it.
lofifile="$root/boot/x86.miniroot-safe"
fi
lofidev=`lofiadm -a $lofifile 2>/dev/null`
if [ -n "$lofidev" ]; then
mkdir /tmp/bfubin/mnt
mount -r $lofidev /tmp/bfubin/mnt
unix=/tmp/bfubin/mnt/boot/platform/i86pc/kernel/unix
if [ -f $unix ]; then
cp $unix /tmp/bfubin/unix
failsafe_type=directboot
elif [ -f /tmp/bfubin/mnt/platform/i86pc/multiboot ]
then
failsafe_type=multiboot
fi
umount /tmp/bfubin/mnt
rmdir /tmp/bfubin/mnt
lofiadm -d $lofidev
fi
rm -f /tmp/bfubin/miniroot-unzipped
fi
revert_aggregation_conf()
{
aggrconf=$rootprefix/etc/aggregation.conf
nawk '
/^[ \t]*#/ || /^[ \t]*$/ || $4 ~ "/0" {
print;
next;
}
{
OFS="\t";
gsub(/[^,]*/, "&/0", $4);
print;
}' $aggrconf > $aggrconf.bfutmp
mv -f $aggrconf.bfutmp $aggrconf
}
remove_initd_links()
{
# If we're delivering a new version of an existing /etc/init.d script,
# remove all hard links to the existing file in /etc/rc?.d whose
# names begin with [SK][0-9][0-9]. Additionally, in case an S or K
# file was previously delivered as a symbolic link or the hard link
# was broken, remove any file in /etc/rc?.d whose name is
# [SK][0-9][0-9] followed by the basename of the file we're going
# to update in /etc/init.d.
print "Removing init.d links ... \c"
scripts=`$ZCAT $cpiodir/generic.root$ZFIX |
cpio -it 2>/dev/null | grep '^etc/init\.d/'`
if [ -n "$scripts" ]; then
inodes=`ls -li $scripts 2>/dev/null | \
nawk '{ print "-inum " $1 " -o " }'`
names=`ls -1 $scripts 2>/dev/null | \
nawk -F/ '{ print "-name [SK][0-9][0-9]" $NF }'`
find etc/rc?.d \( $inodes $names \) -print | xargs rm -f
fi
print "done."
}
#
# Remove Wildcat (aka Sun Fire Link)
#
remove_eof_wildcat()
{
# Packages to remove
typeset -r wildcat_pkgs='SUNWwrsa SUNWwrsd SUNWwrsu SUNWwrsm'
typeset pkg
#
# First, attempt to remove the packages cleanly if possible.
# Use a custom "admin" file to specify that removal scripts
# in the packages being removed should be run even if they
# will run as root.
#
typeset -r admfile='/tmp/wcat_eof.$$'
echo "action=nocheck" > $admfile
printf 'Removing Wildcat packages...'
for pkg in $wildcat_pkgs
do
if pkginfo $pkgroot -q $pkg; then
printf ' %s' $pkg
pkgrm $pkgroot -n -a $admfile $pkg >/dev/null 2>&1
fi
done
printf '\n'
#
# In case that didn't work, do it manually.
#
printf 'Removing Wildcat from %s/var/sadm/install/contents...' \
$rootprefix
for pkg in $wildcat_pkgs
do
printf ' %s' $pkg
if [ -d $rootprefix/var/sadm/pkg/$pkg ]; then
rm -rf $rootprefix/var/sadm/pkg/$pkg
grep -vw $pkg $rootprefix/var/sadm/install/contents > \
/tmp/contents.$$
cp /tmp/contents.$$ \
$rootprefix/var/sadm/install/contents
rm /tmp/contents.$$
fi
done
printf '\n'
#
# Cleanup any remaining Wildcat files, symlinks, and directories.
#
rm -f $usr/platform/sun4u/include/sys/wci_common.h
rm -f $usr/platform/sun4u/include/sys/wci_regs.h
rm -f $usr/platform/sun4u/include/sys/wci_offsets.h
rm -f $usr/platform/sun4u/include/sys/wci_cmmu.h
rm -f $usr/platform/sun4u/include/sys/wrsm.h
rm -f $usr/platform/sun4u/include/sys/wrsm_common.h
rm -f $usr/platform/sun4u/include/sys/wrsm_config.h
rm -f $usr/platform/sun4u/include/sys/wrsm_types.h
rm -f $usr/platform/sun4u/include/sys/wrsm_plat.h
rm -f $usr/platform/sun4u/include/sys/wrsm_plugin.h
rm -f $usr/platform/sun4u/include/sys/wrsmconf.h
rm -f $usr/platform/sun4u/lib/mdb/kvm/sparcv9/wrsm.so
rm -f $usr/platform/sun4u/lib/mdb/kvm/sparcv9/wrsmd.so
rm -f $rootprefix/platform/SUNW,Sun-Fire-15000/kernel/misc/sparcv9/gptwo_wci
rm -f $rootprefix/platform/sun4u/kernel/kmdb/sparcv9/wrsm
rm -f $rootprefix/platform/sun4u/kernel/kmdb/sparcv9/wrsmd
rm -f $admfile
}
#
# Remove ASET
#
remove_eof_aset()
{
# Packages to remove
typeset -r aset_pkgs='SUNWast'
typeset pkg
printf 'Removing ASET... '
#
# First, attempt to remove the packages cleanly if possible.
#
for pkg in $aset_pkgs
do
if pkginfo $pkgroot -q $pkg; then
printf ' %s' $pkg
pkgrm $pkgroot -n $pkg >/dev/null 2>&1
fi
done
printf '\n'
#
# In case that didn't work, do it manually.
# Remove ASET from $rootprefix/var/sadm/install/contents
#
for pkg in $aset_pkgs
do
if [ -d $rootprefix/var/sadm/pkg/$pkg ]; then
rm -rf $rootprefix/var/sadm/pkg/$pkg
grep -vw $pkg $rootprefix/var/sadm/install/contents > \
/tmp/contents.$$
cp /tmp/contents.$$ $rootprefix/var/sadm/install/contents.$$
rm /tmp/contents.$$
fi
done
#
# Cleanup any remaining ASET files, symlinks, and directories.
#
rm -rf $usr/aset
}
#
# Remove BIND 8 named server/tools packages
#
remove_eof_bind8()
{
# Packages to remove
typeset -r bind8_pkg='SUNWinamd'
typeset pkg
printf 'Removing BIND 8 named server/tools... '
#
# We cann't pkgrm SUNWinamd at this time as the BIND 9 binaries are
# already in /usr/sbin.
# Remove BIND 8 packages from $rootprefix/var/sadm/install/contents
#
for pkg in $bind8_pkgs
do
if [ -d $rootprefix/var/sadm/pkg/$pkg ]; then
rm -rf $rootprefix/var/sadm/pkg/$pkg
grep -vw $pkg $rootprefix/var/sadm/install/contents > \
/tmp/contents.$$
cp /tmp/contents.$$ /var/sadm/install/contents.$$
rm /tmp/contents.$$
fi
done
#
# Cleanup any BIND 8 specific files, symlinks.
#
# files and symlinks.
rm -f $usr/sbin/named-xfer
rm -f $usr/lib/nslookup.help
rm -f $usr/sbin/dnskeygen
rm -f $usr/sbin/named-bootconf
rm -f $usr/sbin/nstest
rm -rf $rootprefix/var/run/ndc.d
printf 'done.\n'
}
#
# Remove the 5.6.1 version of perl.
#
remove_perl_561()
{
#
# Packages to remove.
#
typeset -r perl_pkgs='SUNWpl5m SUNWpl5p SUNWpl5u SUNWpl5v'
#
# First, attempt to remove the packages cleanly if possible.
#
typeset pkg
printf 'Removing perl 5.6.1 packages'
for pkg in $perl_pkgs
do
if pkginfo $pkgroot -q $pkg; then
printf ' %s' $pkg
pkgrm $pkgroot -n $pkg >/dev/null 2>&1
fi
done
printf '\n'
#
# In case that didn't work, do it manually.
#
printf 'Removing perl 5.6.1 from %s/var/sadm/install/contents' \
$rootprefix
for pkg in $PKGS
do
printf ' %s' $pkg
if [ -d $rootprefix/var/sadm/pkg/$pkg ]; then
rm -rf $rootprefix/var/sadm/pkg/$pkg
grep -vw $pkg $rootprefix/var/sadm/install/contents > \
/tmp/contents.$$
cp /tmp/contents.$$ /var/sadm/install/contents.$$
rm /tmp/contents.$$
fi
done
printf '\n'
#
# Remove any remaining 5.6.1 files,
#
printf 'Removing perl 5.6.1 from %s/perl5\n' $usr
# Directories.
rm -rf $usr/perl5/5.6.1
rm -rf $usr/perl5/site_perl/5.6.1
rm -rf $usr/perl5/vendor_perl/5.6.1
}
#
# Remove FNS/XFN packages
#
remove_eof_fns()
{
# Packages to remove
typeset -r fns_pkgs='SUNWfnx5x SUNWfnsx5 SUNWfnsx SUNWfns'
typeset pkg
printf 'Removing FNS/XFN ... '
#
# First, attempt to remove the packages cleanly if possible.
#
for pkg in $fns_pkgs
do
if pkginfo $pkgroot -q $pkg; then
printf ' %s' $pkg
pkgrm $pkgroot -n $pkg >/dev/null 2>&1
fi
done
printf '\n'
#
# In case that didn't work, do it manually.
# Remove FNS/XFN from $rootprefix/var/sadm/install/contents
#
for pkg in $fns_pkgs
do
if [ -d $rootprefix/var/sadm/pkg/$pkg ]; then
rm -rf $rootprefix/var/sadm/pkg/$pkg
grep -vw $pkg $rootprefix/var/sadm/install/contents > \
/tmp/contents.$$
cp /tmp/contents.$$ $rootprefix/var/sadm/install/contents.$$
rm /tmp/contents.$$
fi
done
#
# Cleanup if any remaining FNS/XFN files, symlinks, and directories.
#
# directories.
rm -rf $rootprefix/etc/fn
rm -rf $usr/include/xfn
rm -rf $usr/lib/fn
rm -rf $rootprefix/var/fn
# files and symlinks.
rm -f $rootprefix/etc/fn.conf
rm -f $usr/bin/fnattr
rm -f $usr/bin/fnbind
rm -f $usr/bin/fncreate_printer
rm -f $usr/bin/fnlist
rm -f $usr/bin/fnlookup
rm -f $usr/bin/fnrename
rm -f $usr/bin/fnsearch
rm -f $usr/bin/fnunbind
rm -f $usr/sbin/fncheck
rm -f $usr/sbin/fncopy
rm -f $usr/sbin/fncreate
rm -f $usr/sbin/fncreate_fs
rm -f $usr/sbin/fndestroy
rm -f $usr/sbin/fnselect
rm -f $usr/sbin/fnsypd
rm -f $usr/lib/libfn_p.so
rm -f $usr/lib/libfn_p.so.1
rm -f $usr/lib/libfn_spf.so
rm -f $usr/lib/libfn_spf.so.1
rm -f $usr/lib/libxfn.so
rm -f $usr/lib/libxfn.so.1
rm -f $usr/lib/libxfn.so.2
rm -f $usr/lib/sparcv9/libfn_p.so
rm -f $usr/lib/sparcv9/libfn_p.so.1
rm -f $usr/lib/sparcv9/libfn_spf.so
rm -f $usr/lib/sparcv9/libfn_spf.so.1
rm -f $usr/lib/sparcv9/libxfn.so
rm -f $usr/lib/sparcv9/libxfn.so.1
rm -f $usr/lib/sparcv9/libxfn.so.2
}
remove_eof_face() {
# Packages to remove
typeset -r face_pkgs='SUNWfac'
typeset pkg
printf 'Removing AT&T FACE... '
#
# First, attempt to remove the packages cleanly if possible.
#
for pkg in $face_pkgs
do
if pkginfo $pkgroot -q $pkg; then
printf ' %s' $pkg
pkgrm $pkgroot -n $pkg >/dev/null 2>&1
fi
done
printf '\n'
#
# In case that didn't work, do it manually.
# Remove FACE from $rootprefix/var/sadm/install/contents
#
for pkg in $face_pkgs
do
if [ -d $rootprefix/var/sadm/pkg/$pkg ]; then
rm -rf $rootprefix/var/sadm/pkg/$pkg
grep -vw $pkg $rootprefix/var/sadm/install/contents > \
/tmp/contents.$$
cp /tmp/contents.$$ $rootprefix/var/sadm/install/contents.$$
rm /tmp/contents.$$
fi
done
#
# Cleanup any remaining FACE files, symlinks, and directories.
#
rm -rf $usr/oasys
rm -rf $usr/vmsys
}
remove_eof_dmi() {
# Packages to remove
typeset -r dmi_pkgs='SUNWsadmi'
typeset pkg
printf 'Removing DMI... '
#
# First, attempt to remove the packages cleanly if possible.
#
for pkg in $dmi_pkgs
do
if pkginfo $pkgroot -q $pkg; then
printf ' %s' $pkg
pkgrm $pkgroot -n $pkg >/dev/null 2>&1
fi
done
printf '\n'
#
# In case that didn't work, do it manually.
# Remove DMI from $rootprefix/var/sadm/install/contents
#
for pkg in $dmi_pkgs
do
if [ -d $rootprefix/var/sadm/pkg/$pkg ]; then
rm -rf $rootprefix/var/sadm/pkg/$pkg
grep -vw $pkg $rootprefix/var/sadm/install/contents > \
/tmp/contents.$$
cp /tmp/contents.$$ $rootprefix/var/sadm/install/contents.$$
rm /tmp/contents.$$
fi
done
#
# Cleanup any remaining DMI files, symlinks, and directories.
#
rm -rf $usr/lib/dmi
rm -rf $rootprefix/var/dmi
rm -rf $rootprefix/etc/dmi
rm -f $usr/lib/libdmi.so
rm -f $usr/lib/libdmici.so
rm -f $usr/lib/libdmimi.so
rm -f $usr/lib/libdmi.so.1
rm -f $usr/lib/libdmici.so.1
rm -f $usr/lib/libdmimi.so.1
rm -f $usr/lib/sparcv9/libdmi.so
rm -f $usr/lib/sparcv9/libdmici.so
rm -f $usr/lib/sparcv9/libdmimi.so
rm -f $usr/lib/sparcv9/libdmi.so.1
rm -f $usr/lib/sparcv9/libdmici.so.1
rm -f $usr/lib/sparcv9/libdmimi.so.1
rm -f $usr/lib/amd64/libdmi.so
rm -f $usr/lib/amd64/libdmici.so
rm -f $usr/lib/amd64/libdmimi.so
rm -f $usr/lib/amd64/libdmi.so.1
rm -f $usr/lib/amd64/libdmici.so.1
rm -f $usr/lib/amd64/libdmimi.so.1
rm -f $usr/sbin/dmi_cmd
rm -f $usr/sbin/dmiget
rm -f $rootprefix/etc/init.d/init.dmi
rm -f $rootprefix/etc/rc0.d/K07dmi
rm -f $rootprefix/etc/rc1.d/K07dmi
rm -f $rootprefix/etc/rc2.d/K07dmi
rm -f $rootprefix/etc/rcS.d/K07dmi
rm -f $rootprefix/etc/rc3.d/S77dmi
}
#
# Remove vold
#
remove_eof_vold()
{
printf 'Removing vold... '
rm -rf $usr/lib/vold
rm -rf $usr/lib/rmmount
rm -f $usr/lib/fs/hsfs/ident_hsfs.so.1
rm -f $usr/lib/fs/pcfs/ident_pcfs.so.1
rm -f $usr/lib/fs/udfs/ident_udfs.so.1
rm -f $usr/lib/fs/ufs/ident_ufs.so.1
rm -f $usr/sbin/vold
rm -f $usr/kernel/drv/vol
rm -f $usr/kernel/drv/amd64/vol
rm -f $usr/kernel/drv/sparcv9/vol
rm -f $usr/include/rmmount.h
rm -f $usr/include/vol.h
rm -f $rootprefix/etc/vold.conf
rm -f $rootprefix/etc/rmmount.conf
printf '\n'
}
#
# Remove the obsolete Mobile IP packages
#
remove_eof_mobileip() {
typeset -r mip_pkgs='SUNWmipr SUNWmipu'
typeset pkg
printf 'Removing Mobile IP... '
for pkg in $mip_pkgs
do
if pkginfo $pkgroot -q $pkg; then
printf ' %s' $pkg
pkgrm $pkgroot -n $pkg >/dev/null 2>&1
fi
done
# In case that did not work, do it manually.
if [[ -d $rootprefix/var/sadm/pkg/SUNWmipr ]]; then