12851Sjongkis#!/bin/ksh -p
20Sstevel@tonic-gate#
30Sstevel@tonic-gate# CDDL HEADER START
40Sstevel@tonic-gate#
50Sstevel@tonic-gate# The contents of this file are subject to the terms of the
61777Ssetje# Common Development and Distribution License (the "License").
71777Ssetje# You may not use this file except in compliance with the License.
80Sstevel@tonic-gate#
90Sstevel@tonic-gate# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
100Sstevel@tonic-gate# or http://www.opensolaris.org/os/licensing.
110Sstevel@tonic-gate# See the License for the specific language governing permissions
120Sstevel@tonic-gate# and limitations under the License.
130Sstevel@tonic-gate#
140Sstevel@tonic-gate# When distributing Covered Code, include this CDDL HEADER in each
150Sstevel@tonic-gate# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
160Sstevel@tonic-gate# If applicable, add the following below this CDDL HEADER, with the
170Sstevel@tonic-gate# fields enclosed by brackets "[]" replaced with your own identifying
180Sstevel@tonic-gate# information: Portions Copyright [yyyy] [name of copyright owner]
190Sstevel@tonic-gate#
200Sstevel@tonic-gate# CDDL HEADER END
210Sstevel@tonic-gate#
220Sstevel@tonic-gate
233446Smrj# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
240Sstevel@tonic-gate# Use is subject to license terms.
250Sstevel@tonic-gate#
261777Ssetje# ident	"%Z%%M%	%I%	%E% SMI"
270Sstevel@tonic-gate
280Sstevel@tonic-gate# utility to pack and unpack a boot/root archive
290Sstevel@tonic-gate# both ufs and hsfs (iso9660) format archives are unpacked
300Sstevel@tonic-gate# only ufs archives are generated
310Sstevel@tonic-gate#
320Sstevel@tonic-gate# usage: pack   <archive> <root>
330Sstevel@tonic-gate#        unpack <archive> <root>
340Sstevel@tonic-gate#        packmedia   <solaris_image> <root>
350Sstevel@tonic-gate#        unpackmedia <solaris_image> <root>
360Sstevel@tonic-gate#
370Sstevel@tonic-gate#   Where <root> is the directory to unpack to and will be cleaned out
380Sstevel@tonic-gate#   if it exists.
390Sstevel@tonic-gate#
400Sstevel@tonic-gate#   In the case of (un)packmedia, the image is packed or unpacked to/from
410Sstevel@tonic-gate#   Solaris media and all the things that don't go into the ramdisk image
420Sstevel@tonic-gate#   are (un)cpio'd as well
430Sstevel@tonic-gate#
441777Ssetje# This utility is also used to pack parts (in essence the window system,
451777Ssetje# usr/dt and usr/openwin) of the non ramdisk SPARC
461777Ssetje# miniroot. (un)packmedia will recognize that they are being run a SPARC
471777Ssetje# miniroot and do the appropriate work.
481777Ssetje#
490Sstevel@tonic-gate
500Sstevel@tonic-gateusage()
510Sstevel@tonic-gate{
520Sstevel@tonic-gate	printf "usage: root_archive pack <archive> <root>\n"
530Sstevel@tonic-gate	printf "       root_archive unpack <archive> <root>\n"
540Sstevel@tonic-gate	printf "       root_archive packmedia   <solaris_image> <root>\n"
550Sstevel@tonic-gate	printf "       root_archive unpackmedia <solaris_image> <root>\n"
560Sstevel@tonic-gate}
570Sstevel@tonic-gate
582334Ssetjecleanup()
592334Ssetje{
602334Ssetje	if [ -d $MNT ] ; then
612334Ssetje		umount $MNT 2> /dev/null
622334Ssetje		rmdir $MNT
632334Ssetje	fi
642334Ssetje
652851Sjongkis	lofiadm -d "$TMR" 2>/dev/null
662851Sjongkis	rm -f "$TMR" "$TMR.gz"
672334Ssetje}
682334Ssetje
69*4889Ssjelinekarchive_Gnome()
70*4889Ssjelinek{
71*4889Ssjelinek	MEDIA="$1"
72*4889Ssjelinek	MINIROOT="$2"
73*4889Ssjelinek
74*4889Ssjelinek	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
75*4889Ssjelinek	RELEASE=`basename "$RELEASE"`
76*4889Ssjelinek
77*4889Ssjelinek	if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
78*4889Ssjelinek		CPIO_DIR="$MEDIA/$RELEASE/Tools/miniroot_extra"
79*4889Ssjelinek		mkdir -p "$CPIO_DIR"
80*4889Ssjelinek	else
81*4889Ssjelinek		CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
82*4889Ssjelinek	fi
83*4889Ssjelinek
84*4889Ssjelinek
85*4889Ssjelinek	# Create the gnome archive
86*4889Ssjelinek	#
87*4889Ssjelinek	(
88*4889Ssjelinek		# Prepopulate the gconf database. This needs to be done and
89*4889Ssjelinek		# done first for several reasons. 1) Archiving out the gnome
90*4889Ssjelinek		# libraries and binaries causes the gconftool-2 to not run
91*4889Ssjelinek		# appropriately at boot time. 2) The binaries and libraries
92*4889Ssjelinek		# needed to run this are big and thus we want to archive
93*4889Ssjelinek		# them separately. 3) Having schemas prepopluated in the
94*4889Ssjelinek		# miniroot means faster boot times.
95*4889Ssjelinek		#
96*4889Ssjelinek
97*4889Ssjelinek		cd "$MINIROOT"
98*4889Ssjelinek		HOME="./tmp/root"
99*4889Ssjelinek		export HOME
100*4889Ssjelinek		umask 0022
101*4889Ssjelinek		GCONF_CONFIG_SOURCE="xml:merged:"$MINIROOT"/.tmp_proto/root/etc/gconf/gconf.xml.defaults"
102*4889Ssjelinek		export GCONF_CONFIG_SOURCE
103*4889Ssjelinek		SCHEMADIR="$MINIROOT/.tmp_proto/root/etc/gconf/schemas"
104*4889Ssjelinek		export SCHEMADIR
105*4889Ssjelinek		/usr/bin/gconftool-2 --makefile-install-rule $SCHEMADIR/*.schemas >/dev/null 2>&1
106*4889Ssjelinek		# usr/share gnome stuff
107*4889Ssjelinek		cd "$MINIROOT"
108*4889Ssjelinek		find usr/share/GConf usr/share/application-registry \
109*4889Ssjelinek		    usr/share/autostart usr/share/dbus-1 usr/share/dtds \
110*4889Ssjelinek		    usr/share/emacs usr/share/gnome usr/share/gnome-2.0 \
111*4889Ssjelinek		    usr/share/gnome-background-properties \
112*4889Ssjelinek		    usr/share/gtk-engines usr/share/gui-install \
113*4889Ssjelinek		    usr/share/icon-naming-utils usr/share/control-center \
114*4889Ssjelinek		    usr/share/icons usr/share/locale usr/share/metacity \
115*4889Ssjelinek		    usr/share/mime usr/share/mime-info usr/share/pixmaps \
116*4889Ssjelinek		    usr/share/scrollkeeper usr/share/sgml usr/share/themes \
117*4889Ssjelinek		    usr/share/xml \
118*4889Ssjelinek		    -print > /tmp/gnome_share.$$ 2>/dev/null
119*4889Ssjelinek
120*4889Ssjelinek		if [ ! -f /tmp/gnome_share.$$ ] ; then
121*4889Ssjelinek			echo "/tmp/gnome_share.$$ file list not found."
122*4889Ssjelinek			return
123*4889Ssjelinek		fi
124*4889Ssjelinek
125*4889Ssjelinek		# usr/lib gnome stuff
126*4889Ssjelinek
127*4889Ssjelinek		find usr/lib/libgnome*\.so\.* \
128*4889Ssjelinek		    usr/lib/libgst*\.so\.* usr/lib/libgconf*\.so\.* \
129*4889Ssjelinek		    usr/lib/libgdk*\.so\.* usr/lib/libgtk*\.so\.* \
130*4889Ssjelinek		    usr/lib/libglade*\.so\.* usr/lib/libmetacity*\.so\.* \
131*4889Ssjelinek		    usr/lib/libfontconfig*\.so\.* usr/lib/libgmodule*\.so\.* \
132*4889Ssjelinek		    usr/lib/libgobject*\.so\.* usr/lib/libgthread*\.so\.* \
133*4889Ssjelinek		    usr/lib/libpopt*\.so\.* usr/lib/libstartup*\.so\.* \
134*4889Ssjelinek		    usr/lib/libexif*\.so\.* usr/lib/libtiff*\.so\.* \
135*4889Ssjelinek		    usr/lib/libdbus*\.so\.* usr/lib/libstartup*\.so\.* \
136*4889Ssjelinek		    usr/lib/libexif*\.so\.* usr/lib/libORBit*\.so\.* \
137*4889Ssjelinek	 	    usr/lib/libmlib*\.so\.* usr/lib/libxsl*\.so\.* \
138*4889Ssjelinek		    usr/lib/libpango*\.so\.* usr/lib/libpng*\.so\.* \
139*4889Ssjelinek		    usr/lib/liboil*\.so\.* usr/lib/libbonobo*\.so\.* \
140*4889Ssjelinek		    usr/lib/libart*\.so\.* usr/lib/libcairo*\.so\.* \
141*4889Ssjelinek		    usr/lib/libjpeg*\.so\.* \
142*4889Ssjelinek		    usr/lib/libpolkit*\.so\.* \
143*4889Ssjelinek			-print | egrep -v '\.so\.[0]$' > \
144*4889Ssjelinek		       /tmp/gnome_lib.$$ 2>/dev/null
145*4889Ssjelinek
146*4889Ssjelinek		find usr/lib/nautilus usr/lib/pango usr/lib/iconv \
147*4889Ssjelinek		    usr/lib/metacity-dialog usr/lib/window-manager-settings \
148*4889Ssjelinek		    usr/lib/bonobo-2.0 usr/lib/bononbo usr/lib/gtk-2.0 \
149*4889Ssjelinek		    usr/lib/GConf usr/lib/bonobo-activation-server \
150*4889Ssjelinek		    usr/lib/python2.4 usr/lib/gstreamer-0.10 \
151*4889Ssjelinek		    usr/lib/gconf-sanity-check-2 usr/lib/gconfd \
152*4889Ssjelinek		    usr/lib/gnome-vfs-2.0 usr/lib/dbus-daemon \
153*4889Ssjelinek		    usr/lib/gnome-vfs-daemon usr/lib/gnome-settings-daemon \
154*4889Ssjelinek		    usr/lib/gnome_segv2 usr/lib/orbit-2.0 \
155*4889Ssjelinek		    usr/lib/libmlib \
156*4889Ssjelinek		    print > /tmp/gnome_libdir.$$ 2>/dev/null
157*4889Ssjelinek
158*4889Ssjelinek		if [ ! -f /tmp/gnome_lib.$$  -a ! -f gnome_libdir.$$ ] ; then
159*4889Ssjelinek			echo "/tmp/gnome_lib.$$ file list not found."
160*4889Ssjelinek			return
161*4889Ssjelinek		fi
162*4889Ssjelinek
163*4889Ssjelinek		# /usr/sfw gnome stuff
164*4889Ssjelinek		find usr/sfw/bin usr/sfw/include usr/sfw/share usr/sfw/src \
165*4889Ssjelinek		    -print > /tmp/gnome_sfw.$$ 2>/dev/null
166*4889Ssjelinek
167*4889Ssjelinek		if [ ! -f /tmp/gnome_sfw.$$ ] ; then
168*4889Ssjelinek			echo "/tmp/gnome_sfw.$$ file list not found."
169*4889Ssjelinek			return
170*4889Ssjelinek		fi
171*4889Ssjelinek
172*4889Ssjelinek		# gnome app binaries usr/bin
173*4889Ssjelinek		find usr/bin/gnome* usr/bin/gui-install usr/bin/bonobo* \
174*4889Ssjelinek		    usr/bin/gtk-* usr/bin/fax* usr/bin/gdk* usr/bin/gif2tiff \
175*4889Ssjelinek		    usr/bin/install-lan \
176*4889Ssjelinek		    usr/bin/metacity* usr/bin/gst-* usr/bin/gconftool-2 \
177*4889Ssjelinek		    usr/bin/pango* usr/bin/desktop* usr/bin/djpeg \
178*4889Ssjelinek		    usr/bin/notify-send usr/bin/oil-bugreport \
179*4889Ssjelinek		    usr/bin/bmp2tiff usr/bin/thembus-theme-applier \
180*4889Ssjelinek		    usr/bin/thumbnail usr/lib/update-* \
181*4889Ssjelinek		    usr/bin/ras2tiff usr/bin/raw2tiff usr/bin/rdjpgcom \
182*4889Ssjelinek		    usr/bin/thumbnail usr/bin/dbus* \
183*4889Ssjelinek		    usr/bin/tiff* usr/bin/rgb2ycbcr \
184*4889Ssjelinek		    usr/bin/fc-cache usr/bin/fc-list \
185*4889Ssjelinek			-print > /tmp/gnome_bin.$$ 2>/dev/null
186*4889Ssjelinek
187*4889Ssjelinek		if [ ! -f /tmp/gnome_bin.$$ ] ; then
188*4889Ssjelinek			echo "/tmp/gnome_bin.$$ file list not found."
189*4889Ssjelinek			return
190*4889Ssjelinek		fi
191*4889Ssjelinek
192*4889Ssjelinek		# Cat all the files together and create the gnome archive
193*4889Ssjelinek		#
194*4889Ssjelinek
195*4889Ssjelinek		cat /tmp/gnome_libdir.$$ /tmp/gnome_lib.$$ \
196*4889Ssjelinek		     /tmp/gnome_share.$$ /tmp/gnome_sfw.$$ /tmp/gnome_bin.$$ \
197*4889Ssjelinek		    > /tmp/gnome.$$
198*4889Ssjelinek
199*4889Ssjelinek		if [ ! -f /tmp/gnome.$$ ] ; then
200*4889Ssjelinek			echo "/tmp/gnome.$$ file not found."
201*4889Ssjelinek			return
202*4889Ssjelinek		fi
203*4889Ssjelinek		# Save off this file in the miniroot for use later
204*4889Ssjelinek		# when unpacking. Clean up old cruft if there.
205*4889Ssjelinek		#
206*4889Ssjelinek
207*4889Ssjelinek		if [ -f .tmp_proto/gnome_saved ]; then
208*4889Ssjelinek			rm -f .tmp_proto/gnome_saved
209*4889Ssjelinek		fi
210*4889Ssjelinek
211*4889Ssjelinek		cp /tmp/gnome.$$ .tmp_proto/gnome_saved
212*4889Ssjelinek
213*4889Ssjelinek		# Create gnome archive
214*4889Ssjelinek		#
215*4889Ssjelinek
216*4889Ssjelinek		cpio -ocmPuB < /tmp/gnome.$$ 2>/dev/null | bzip2 > \
217*4889Ssjelinek		    "$CPIO_DIR/gnome.cpio.bz2"
218*4889Ssjelinek
219*4889Ssjelinek		# Remove files from miniroot that are in archive.
220*4889Ssjelinek		# Create symlinks for files in archive
221*4889Ssjelinek
222*4889Ssjelinek		rm -rf `cat /tmp/gnome_share.$$`
223*4889Ssjelinek
224*4889Ssjelinek		for i in `cat /tmp/gnome_share.$$`
225*4889Ssjelinek		do
226*4889Ssjelinek			ln -s /tmp/root/$i $i 2>/dev/null
227*4889Ssjelinek		done
228*4889Ssjelinek
229*4889Ssjelinek		rm -rf `cat /tmp/gnome_lib.$$`
230*4889Ssjelinek		for i in `cat /tmp/gnome_lib.$$`
231*4889Ssjelinek		do
232*4889Ssjelinek			ln -s /tmp/root/$i $i 2>/dev/null
233*4889Ssjelinek		done
234*4889Ssjelinek
235*4889Ssjelinek		rm -rf `cat /tmp/gnome_libdir.$$`
236*4889Ssjelinek		for i in `cat /tmp/gnome_libdir.$$`
237*4889Ssjelinek		do
238*4889Ssjelinek			ln -s /tmp/root/$i $i 2>/dev/null
239*4889Ssjelinek		done
240*4889Ssjelinek
241*4889Ssjelinek		rm -rf `cat /tmp/gnome_sfw.$$`
242*4889Ssjelinek		for i in `cat /tmp/gnome_sfw.$$`
243*4889Ssjelinek		do
244*4889Ssjelinek			ln -s /tmp/root/$i $i 2>/dev/null
245*4889Ssjelinek		done
246*4889Ssjelinek
247*4889Ssjelinek		rm -rf `cat /tmp/gnome_bin.$$`
248*4889Ssjelinek		for i in `cat /tmp/gnome_bin.$$`
249*4889Ssjelinek		do
250*4889Ssjelinek			ln -s /tmp/root/$i $i 2>/dev/null
251*4889Ssjelinek		done
252*4889Ssjelinek		rm -f /tmp/gnome_share.$$
253*4889Ssjelinek		rm -f /tmp/gnome_lib.$$
254*4889Ssjelinek		rm -f /tmp/gnome_libdir.$$
255*4889Ssjelinek		rm -f /tmp/gnome_bin.$$
256*4889Ssjelinek	)
257*4889Ssjelinek}
258*4889Ssjelinek
259*4889Ssjelinekarchive_JavaGUI()
260*4889Ssjelinek{
261*4889Ssjelinek	MEDIA="$1"
262*4889Ssjelinek	MINIROOT="$2"
263*4889Ssjelinek
264*4889Ssjelinek	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
265*4889Ssjelinek	RELEASE=`basename "$RELEASE"`
266*4889Ssjelinek
267*4889Ssjelinek	if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
268*4889Ssjelinek		CPIO_DIR="$MEDIA/$RELEASE/Tools/miniroot_extra"
269*4889Ssjelinek		mkdir -p "$CPIO_DIR"
270*4889Ssjelinek	else
271*4889Ssjelinek		CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
272*4889Ssjelinek	fi
273*4889Ssjelinek
274*4889Ssjelinek	# Archive the java wizard components that are only used in the
275*4889Ssjelinek	# non developer express path.
276*4889Ssjelinek	#
277*4889Ssjelinek	(
278*4889Ssjelinek		# path is usr/lib/install/data
279*4889Ssjelinek		cd "$MINIROOT"
280*4889Ssjelinek		find usr/lib/install/data/wizards \
281*4889Ssjelinek		    -print > /tmp/java_ui.$$ 2>/dev/null
282*4889Ssjelinek
283*4889Ssjelinek		if [ ! -f /tmp/java_ui.$$ ] ; then
284*4889Ssjelinek			echo "/tmp/java_ui.$$ file list not found."
285*4889Ssjelinek			return
286*4889Ssjelinek		fi
287*4889Ssjelinek
288*4889Ssjelinek		cpio -ocmPuB < /tmp/java_ui.$$ 2>/dev/null | bzip2 > \
289*4889Ssjelinek		    "$CPIO_DIR/javaui.cpio.bz2"
290*4889Ssjelinek
291*4889Ssjelinek		rm -rf `cat /tmp/java_ui.$$`
292*4889Ssjelinek		ln -s /tmp/root/usr/lib/install/data/wizards usr/lib/install/data/wizards 2>/dev/null
293*4889Ssjelinek
294*4889Ssjelinek		rm -f /tmp/java_ui.$$
295*4889Ssjelinek
296*4889Ssjelinek	)
297*4889Ssjelinek}
298*4889Ssjelinek
299*4889Ssjelinekarchive_Misc()
300*4889Ssjelinek{
301*4889Ssjelinek	MEDIA="$1"
302*4889Ssjelinek	MINIROOT="$2"
303*4889Ssjelinek
304*4889Ssjelinek	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
305*4889Ssjelinek	RELEASE=`basename "$RELEASE"`
306*4889Ssjelinek
307*4889Ssjelinek	if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
308*4889Ssjelinek		CPIO_DIR="$MEDIA/$RELEASE/Tools/miniroot_extra"
309*4889Ssjelinek		mkdir -p "$CPIO_DIR"
310*4889Ssjelinek	else
311*4889Ssjelinek		CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
312*4889Ssjelinek	fi
313*4889Ssjelinek
314*4889Ssjelinek	# Archive misc stuff that is needed by non devex installer
315*4889Ssjelinek	#
316*4889Ssjelinek	(
317*4889Ssjelinek		# usr/lib stuff
318*4889Ssjelinek		cd "$MINIROOT"
319*4889Ssjelinek		find usr/lib/lp -print > /tmp/lp.$$ 2>/dev/null
320*4889Ssjelinek		if [ ! -f /tmp/lp.$$ ] ; then
321*4889Ssjelinek			echo "/tmp/lp.$$ file list not found."
322*4889Ssjelinek			return
323*4889Ssjelinek		fi
324*4889Ssjelinek
325*4889Ssjelinek		cpio -ocmPuB < /tmp/lp.$$ 2>/dev/null | bzip2 > \
326*4889Ssjelinek		    "$CPIO_DIR/lpmisc.cpio.bz2"
327*4889Ssjelinek
328*4889Ssjelinek		rm -rf `cat /tmp/lp.$$`
329*4889Ssjelinek		ln -s /tmp/root/usr/lib/lp usr/lib/lp 2>/dev/null
330*4889Ssjelinek
331*4889Ssjelinek		rm -f /tmp/lp.$$
332*4889Ssjelinek	)
333*4889Ssjelinek
334*4889Ssjelinek}
335*4889Ssjelinek
336*4889Ssjelinekarchive_Perl()
337*4889Ssjelinek{
338*4889Ssjelinek	MEDIA="$1"
339*4889Ssjelinek	MINIROOT="$2"
340*4889Ssjelinek
341*4889Ssjelinek	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
342*4889Ssjelinek	RELEASE=`basename "$RELEASE"`
343*4889Ssjelinek
344*4889Ssjelinek	if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
345*4889Ssjelinek		CPIO_DIR="$MEDIA/$RELEASE/Tools/miniroot_extra"
346*4889Ssjelinek		mkdir -p "$CPIO_DIR"
347*4889Ssjelinek	else
348*4889Ssjelinek		CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
349*4889Ssjelinek	fi
350*4889Ssjelinek
351*4889Ssjelinek	# Archive perl, it is only needed by gnome gui.
352*4889Ssjelinek	#
353*4889Ssjelinek	(
354*4889Ssjelinek		# in usr
355*4889Ssjelinek		cd "$MINIROOT"
356*4889Ssjelinek		find usr/perl5 -print > /tmp/perl.$$ 2>/dev/null
357*4889Ssjelinek
358*4889Ssjelinek		if [ ! -f /tmp/perl.$$ ] ; then
359*4889Ssjelinek			echo "/tmp/perl.$$ file list not found."
360*4889Ssjelinek			return
361*4889Ssjelinek		fi
362*4889Ssjelinek		cpio -ocmPuB < /tmp/perl.$$ 2>/dev/null | bzip2 > \
363*4889Ssjelinek		    "$CPIO_DIR/perl.cpio.bz2"
364*4889Ssjelinek
365*4889Ssjelinek		rm -rf `cat /tmp/perl.$$` 2>/dev/null
366*4889Ssjelinek		ln -s /tmp/root/perl5 usr/perl5 2>/dev/null
367*4889Ssjelinek
368*4889Ssjelinek		rm -f /tmp/perl.$$
369*4889Ssjelinek	)
370*4889Ssjelinek}
3711777Ssetjearchive_X()
3720Sstevel@tonic-gate{
3731777Ssetje	MEDIA="$1"
3741777Ssetje	MINIROOT="$2"
3750Sstevel@tonic-gate
3761777Ssetje	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
3771777Ssetje	RELEASE=`basename "$RELEASE"`
3780Sstevel@tonic-gate
3791777Ssetje	if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
3801777Ssetje		CPIO_DIR="$MEDIA/$RELEASE/Tools/miniroot_extra"
3811777Ssetje		mkdir -p "$CPIO_DIR"
3821777Ssetje	else
3831777Ssetje		CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
3841777Ssetje	fi
3850Sstevel@tonic-gate
3860Sstevel@tonic-gate	# create the graphics and non-graphics X archive
3870Sstevel@tonic-gate	#
3882851Sjongkis	(
389*4889Ssjelinek		cd "$MINIROOT"
390*4889Ssjelinek		find usr/openwin usr/dt usr/X11 -print 2> /dev/null |\
3912851Sjongkis		    cpio -ocmPuB 2> /dev/null | bzip2 > "$CPIO_DIR/X.cpio.bz2"
3920Sstevel@tonic-gate
393*4889Ssjelinek		find usr/openwin/bin/mkfontdir \
394*4889Ssjelinek		     usr/openwin/lib/installalias \
395*4889Ssjelinek		     usr/openwin/server/lib/libfont.so.1 \
396*4889Ssjelinek		     usr/openwin/server/lib/libtypesclr.so.0 \
3972851Sjongkis			 -print | cpio -ocmPuB 2> /dev/null | bzip2 > \
3982851Sjongkis			 "$CPIO_DIR/X_small.cpio.bz2"
3990Sstevel@tonic-gate
400*4889Ssjelinek		rm -rf usr/dt usr/openwin usr/X11
401*4889Ssjelinek		ln -s /tmp/root/usr/dt usr/dt
402*4889Ssjelinek		ln -s /tmp/root/usr/openwin usr/openwin
403*4889Ssjelinek		ln -s /tmp/root/usr/X11 usr/X11
4042851Sjongkis	)
4051777Ssetje}
4061777Ssetje
4071777Ssetjepackmedia()
4081777Ssetje{
4091777Ssetje	MEDIA="$1"
4101777Ssetje	MINIROOT="$2"
4111777Ssetje
4121777Ssetje	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
4131777Ssetje	RELEASE=`basename "$RELEASE"`
4141777Ssetje
4151777Ssetje	mkdir -p "$MEDIA/$RELEASE/Tools/Boot"
4163446Smrj	mkdir -p "$MEDIA/boot/platform/i86pc/kernel"
4171777Ssetje
4181777Ssetje	# archive package databases to conserve memory
4191777Ssetje	#
4202851Sjongkis	(
4212851Sjongkis		cd "$MINIROOT"
4222851Sjongkis		find tmp/root/var/sadm/install tmp/root/var/sadm/pkg -print | \
4232851Sjongkis		    cpio -ocmPuB 2> /dev/null | bzip2 > \
4242851Sjongkis		    "$MEDIA/$RELEASE/Tools/Boot/pkg_db.cpio.bz2"
4252851Sjongkis	)
4261777Ssetje
4271777Ssetje	rm -rf "$MINIROOT/tmp/root/var/sadm/install"
4281777Ssetje	rm -rf "$MINIROOT/tmp/root/var/sadm/pkg"
4291777Ssetje
4300Sstevel@tonic-gate	# clear out 64 bit support to conserve memory
4310Sstevel@tonic-gate	#
4322851Sjongkis	if [ "$STRIP_AMD64" != false ] ; then
4332334Ssetje		find "$MINIROOT" -name amd64 -type directory | xargs rm -rf
4342334Ssetje	fi
4350Sstevel@tonic-gate
4362595Ssetje	archive_X "$MEDIA" "$MINIROOT"
4372595Ssetje
438*4889Ssjelinek	# Take out the gnome and java parts of the installer from
439*4889Ssjelinek	# the miniroot. These are not required to boot the system
440*4889Ssjelinek	# and start the installers.
441*4889Ssjelinek
442*4889Ssjelinek	archive_Gnome "$MEDIA" "$MINIROOT"
443*4889Ssjelinek	archive_JavaGUI "$MEDIA" "$MINIROOT"
444*4889Ssjelinek	archive_Perl "$MEDIA" "$MINIROOT"
445*4889Ssjelinek	archive_Misc "$MEDIA" "$MINIROOT"
446*4889Ssjelinek
4471777Ssetje	cp "$MINIROOT/platform/i86pc/multiboot" "$MEDIA/boot"
4483446Smrj	cp "$MINIROOT/platform/i86pc/kernel/unix" \
4493446Smrj	    "$MEDIA/boot/platform/i86pc/kernel/unix"
4500Sstevel@tonic-gate
4511821Ssetje	# copy the install menu to menu.lst so we have a menu
4521821Ssetje	# on the install media
4531821Ssetje	#
4541821Ssetje	if [ -f "${MINIROOT}/boot/grub/install_menu" ] ; then
4551821Ssetje		cp ${MINIROOT}/boot/grub/install_menu \
4561821Ssetje		    ${MEDIA}/boot/grub/menu.lst
4571821Ssetje	fi
4581821Ssetje
4592851Sjongkis	(
4602851Sjongkis		cd "$MEDIA/$RELEASE/Tools/Boot"
4612851Sjongkis		ln -sf ../../../boot/x86.miniroot
4622851Sjongkis		ln -sf ../../../boot/multiboot
4632851Sjongkis		ln -sf ../../../boot/grub/pxegrub
4642851Sjongkis	)
4651777Ssetje}
4660Sstevel@tonic-gate
4671777Ssetjeunarchive_X()
4681777Ssetje{
4691777Ssetje	MEDIA="$1"
4701777Ssetje	UNPACKED_ROOT="$2"
4711777Ssetje
4721777Ssetje	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
4731777Ssetje	RELEASE=`basename "$RELEASE"`
4741777Ssetje
4751777Ssetje	if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
4761777Ssetje		CPIO_DIR="$MEDIA/$RELEASE/Tools/miniroot_extra"
4771777Ssetje	else
4781777Ssetje		CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
4790Sstevel@tonic-gate	fi
4801777Ssetje
4811777Ssetje	# unpack X
4821777Ssetje	#
4832851Sjongkis	(
484*4889Ssjelinek		cd "$UNPACKED_ROOT"
485*4889Ssjelinek		rm -rf usr/dt usr/openwin usr/X11
4862851Sjongkis		bzcat "$CPIO_DIR/X.cpio.bz2" | cpio -icdmu 2> /dev/null
4872851Sjongkis	)
4880Sstevel@tonic-gate}
4890Sstevel@tonic-gate
4900Sstevel@tonic-gateunpackmedia()
4911777Ssetje{
4921777Ssetje	MEDIA="$1"
4931777Ssetje	UNPACKED_ROOT="$2"
4940Sstevel@tonic-gate
4951777Ssetje	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
4961777Ssetje	RELEASE=`basename "$RELEASE"`
4971777Ssetje
4981777Ssetje	unarchive_X "$MEDIA" "$UNPACKED_ROOT"
4990Sstevel@tonic-gate
5000Sstevel@tonic-gate	# unpack package databases
5010Sstevel@tonic-gate	#
5022851Sjongkis	(
5032851Sjongkis		cd "$UNPACKED_ROOT"
5042851Sjongkis		bzcat "$MEDIA/$RELEASE/Tools/Boot/pkg_db.cpio.bz2" |
5052851Sjongkis		    cpio -icdmu 2> /dev/null
506*4889Ssjelinek
507*4889Ssjelinek		# unpack gnome, perl, java and misc
508*4889Ssjelinek		# Remove symlinks left from unpacking x86.miniroot so that
509*4889Ssjelinek		# unpacking subsequent archives will populate appropriately.
510*4889Ssjelinek		#
511*4889Ssjelinek		rm -rf usr/perl5
512*4889Ssjelinek		rm -rf usr/lib/install/data/wizards
513*4889Ssjelinek		rm -rf usr/lib/lp
514*4889Ssjelinek
515*4889Ssjelinek		# Gnome list saved off from packmedia
516*4889Ssjelinek		for i in `cat .tmp_proto/gnome_saved`
517*4889Ssjelinek		do
518*4889Ssjelinek			rm -rf $i
519*4889Ssjelinek		done
520*4889Ssjelinek
521*4889Ssjelinek		bzcat "$MEDIA/$RELEASE/Tools/Boot/gnome.cpio.bz2" |
522*4889Ssjelinek		    cpio -icdmu 2>/dev/null
523*4889Ssjelinek		bzcat "$MEDIA/$RELEASE/Tools/Boot/javaui.cpio.bz2" |
524*4889Ssjelinek		    cpio -icdmu 2>/dev/null
525*4889Ssjelinek		bzcat "$MEDIA/$RELEASE/Tools/Boot/lpmisc.cpio.bz2" |
526*4889Ssjelinek		    cpio -icdmu 2>/dev/null
527*4889Ssjelinek		bzcat "$MEDIA/$RELEASE/Tools/Boot/perl.cpio.bz2" |
528*4889Ssjelinek		    cpio -icdmu 2>/dev/null
5292851Sjongkis	)
5300Sstevel@tonic-gate}
5310Sstevel@tonic-gate
5320Sstevel@tonic-gatedo_unpack()
5330Sstevel@tonic-gate{
5341777Ssetje	rm -rf "$UNPACKED_ROOT"
5351777Ssetje	mkdir -p "$UNPACKED_ROOT"
5362851Sjongkis	(
5372851Sjongkis		cd $MNT
5382851Sjongkis		find . -print | cpio -pdum "$UNPACKED_ROOT" 2> /dev/null
5392851Sjongkis	)
5400Sstevel@tonic-gate	umount $MNT
5410Sstevel@tonic-gate}
5420Sstevel@tonic-gate
5430Sstevel@tonic-gateunpack()
5440Sstevel@tonic-gate{
5450Sstevel@tonic-gate
5461777Ssetje	if [ ! -f "$MR" ] ; then
5470Sstevel@tonic-gate		usage
5480Sstevel@tonic-gate		exit 1
5490Sstevel@tonic-gate	fi
5500Sstevel@tonic-gate
5511777Ssetje	gzcat "$MR" > $TMR
5520Sstevel@tonic-gate
5532334Ssetje	LOFIDEV=`/usr/sbin/lofiadm -a $TMR`
5540Sstevel@tonic-gate	if [ $? != 0 ] ; then
5550Sstevel@tonic-gate		echo lofi plumb failed
5560Sstevel@tonic-gate		exit 2
5570Sstevel@tonic-gate	fi
5580Sstevel@tonic-gate
5591777Ssetje	mkdir -p $MNT
5600Sstevel@tonic-gate
5612334Ssetje	FSTYP=`fstyp $LOFIDEV`
5620Sstevel@tonic-gate
5631777Ssetje	if [ "$FSTYP" = ufs ] ; then
5642334Ssetje		/usr/sbin/mount -o ro,nologging $LOFIDEV $MNT
5650Sstevel@tonic-gate		do_unpack
5661777Ssetje	elif [ "$FSTYP" = hsfs ] ; then
5672334Ssetje		/usr/sbin/mount -F hsfs -o ro $LOFIDEV $MNT
5680Sstevel@tonic-gate		do_unpack
5690Sstevel@tonic-gate	else
5700Sstevel@tonic-gate		printf "invalid root archive\n"
5710Sstevel@tonic-gate	fi
5720Sstevel@tonic-gate
5730Sstevel@tonic-gate	rmdir $MNT
5742851Sjongkis	lofiadm -d $TMR ; LOFIDEV=
5750Sstevel@tonic-gate	rm $TMR
5760Sstevel@tonic-gate}
5770Sstevel@tonic-gate
5780Sstevel@tonic-gatepack()
5790Sstevel@tonic-gate{
5801777Ssetje	if [ ! -d "$UNPACKED_ROOT" -o -z "$MR" ] ; then
5810Sstevel@tonic-gate		usage
5820Sstevel@tonic-gate		exit 1
5830Sstevel@tonic-gate	fi
5840Sstevel@tonic-gate
5852511Sjongkis	# Estimate image size and add %10 overhead for ufs stuff.
5862511Sjongkis	# Note, we can't use du here in case $UNPACKED_ROOT is on a filesystem,
5872511Sjongkis	# e.g. zfs, in which the disk usage is less than the sum of the file
5882511Sjongkis	# sizes.  The nawk code
5892511Sjongkis	#
5902511Sjongkis	#	{t += ($7 % 1024) ? (int($7 / 1024) + 1) * 1024 : $7}
5912511Sjongkis	#
5922511Sjongkis	# below rounds up the size of a file/directory, in bytes, to the
5932511Sjongkis	# next multiple of 1024.  This mimics the behavior of ufs especially
5942511Sjongkis	# with directories.  This results in a total size that's slightly
5952511Sjongkis	# bigger than if du was called on a ufs directory.
5962511Sjongkis	size=$(find "$UNPACKED_ROOT" -ls | nawk '
5972511Sjongkis	    {t += ($7 % 1024) ? (int($7 / 1024) + 1) * 1024 : $7}
5982511Sjongkis	    END {print int(t * 1.10 / 1024)}')
5990Sstevel@tonic-gate
6002334Ssetje	/usr/sbin/mkfile ${size}k "$TMR"
6012334Ssetje
6022334Ssetje	LOFIDEV=`/usr/sbin/lofiadm -a "$TMR"`
6030Sstevel@tonic-gate	if [ $? != 0 ] ; then
6040Sstevel@tonic-gate		echo lofi plumb failed
6050Sstevel@tonic-gate		exit 2
6060Sstevel@tonic-gate	fi
6070Sstevel@tonic-gate
6082334Ssetje	RLOFIDEV=`echo $LOFIDEV | sed s/lofi/rlofi/`
6092334Ssetje	newfs $RLOFIDEV < /dev/null 2> /dev/null
6101777Ssetje	mkdir -p $MNT
6112334Ssetje	mount -o nologging $LOFIDEV $MNT
6121777Ssetje	rmdir $MNT/lost+found
6132851Sjongkis	(
6142851Sjongkis		cd "$UNPACKED_ROOT"
6152851Sjongkis		find . -print | cpio -pdum $MNT 2> /dev/null
6162851Sjongkis	)
6170Sstevel@tonic-gate	lockfs -f $MNT
6180Sstevel@tonic-gate	umount $MNT
6190Sstevel@tonic-gate	rmdir $MNT
6202334Ssetje	lofiadm -d $LOFIDEV
6212851Sjongkis	LOFIDEV=
6220Sstevel@tonic-gate
6232334Ssetje	rm -f "$TMR.gz"
6242334Ssetje	gzip -f "$TMR"
6252334Ssetje	mv "$TMR.gz" "$MR"
6261777Ssetje	chmod a+r "$MR"
6270Sstevel@tonic-gate}
6280Sstevel@tonic-gate
6290Sstevel@tonic-gate# main
6300Sstevel@tonic-gate#
6310Sstevel@tonic-gate
6322334SsetjeEXTRA_SPACE=0
6332851SjongkisSTRIP_AMD64=
6342334Ssetje
6352334Ssetjewhile getopts s:6 opt ; do
6362334Ssetje	case $opt in
6372334Ssetje	s)	EXTRA_SPACE="$OPTARG"
6382334Ssetje		;;
6392334Ssetje	6)	STRIP_AMD64=false
6402334Ssetje		;;
6412334Ssetje	*)	usage
6422334Ssetje		exit 1
6432334Ssetje		;;
6442334Ssetje	esac
6452334Ssetjedone
6462334Ssetjeshift `expr $OPTIND - 1`
6472334Ssetje
6480Sstevel@tonic-gateif [ $# != 3 ] ; then
6490Sstevel@tonic-gate	usage
6500Sstevel@tonic-gate	exit 1
6510Sstevel@tonic-gatefi
6520Sstevel@tonic-gate
6531777SsetjeUNPACKED_ROOT="$3"
6541777SsetjeBASE="`pwd`"
6550Sstevel@tonic-gateMNT=/tmp/mnt$$
6562334SsetjeTMR=/tmp/mr$$
6572334SsetjeLOFIDEV=
6581777SsetjeMR="$2"
6590Sstevel@tonic-gate
6600Sstevel@tonic-gateif [ "`dirname $MR`" = . ] ; then
6611777Ssetje	MR="$BASE/$MR"
6620Sstevel@tonic-gatefi
6630Sstevel@tonic-gateif [ "`dirname $UNPACKED_ROOT`" = . ] ; then
6641777Ssetje	UNPACKED_ROOT="$BASE/$UNPACKED_ROOT"
6650Sstevel@tonic-gatefi
6660Sstevel@tonic-gate
6672334Ssetjetrap cleanup EXIT
6682334Ssetje
6690Sstevel@tonic-gatecase $1 in
6700Sstevel@tonic-gate	packmedia)
6711777Ssetje		MEDIA="$MR"
6721777Ssetje		MR="$MR/boot/x86.miniroot"
6731777Ssetje
6741777Ssetje		if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
6751777Ssetje			archive_X "$MEDIA" "$UNPACKED_ROOT"
6761777Ssetje		else
6771777Ssetje			packmedia "$MEDIA" "$UNPACKED_ROOT"
6781777Ssetje			pack
6791777Ssetje		fi ;;
6800Sstevel@tonic-gate	unpackmedia)
6811777Ssetje		MEDIA="$MR"
6821777Ssetje		MR="$MR/boot/x86.miniroot"
6831777Ssetje
6841777Ssetje		if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
6851777Ssetje			unarchive_X "$MEDIA" "$UNPACKED_ROOT"
6861777Ssetje		else
6871777Ssetje			unpack
6881777Ssetje			unpackmedia "$MEDIA" "$UNPACKED_ROOT"
6891777Ssetje		fi ;;
6900Sstevel@tonic-gate	pack)	pack ;;
6910Sstevel@tonic-gate	unpack)	unpack ;;
6920Sstevel@tonic-gate	*)	usage ;;
6930Sstevel@tonic-gateesac
694