#!/bin/bash # # upd-instroot # # Copyright (C) 2007, 2008 Red Hat, Inc. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ORIGDIR=`pwd` DEBUG="" NEEDGR=yes ARCH=`uname -m` while [ $# -gt 0 ]; do case $1 in --nogr) NEEDGR="" shift ;; --debug) DEBUG="--debug" shift ;; --arch) ARCH=$2 shift; shift ;; --mindir) DEST=$2 shift; shift ;; --stg2dir) DESTGR=$2 shift; shift ;; # a filesystem tree to use as updates. could be the output # of 'make install' from anaconda... --updates) UPDATES=$2 shift; shift ;; *) yumconf=$1 shift ;; esac done if [ -z "$yumconf" ]; then echo "upd-instroot: updates instimage from a Red Hat RPMS directory" echo "usage: $0 [--nogr] [--debug] [--arch arch] [--mindir mindir] [--stg2dir stg2dir] [yumconf]" exit 1 fi if [ $ARCH = x86_64 -o $ARCH = s390x -o $ARCH = ppc64 ]; then LIBDIR=lib64 else LIBDIR=lib fi if [ -z "$DEST" ]; then DEST=`mktemp -d ${TMPDIR:-/tmp}/dest.XXXXXX` fi if [ -z "$DESTGR" ]; then DESTGR=`mktemp -d ${TMPDIR:-/tmp}/destgr.XXXXXX` fi if [ ! -f $yumconf ]; then echo "Unable to find yum repo information!" exit 1 fi . $(dirname $0)/buildinstall.functions expandPackageSet() { YUMCONF=$1 YUMDIR=$2 RPMS=$3 PKGDEST=$4 KEEPFILES=$5 [ -d $PKGDEST ] || die "ERROR: directory missing: $PKGDEST" if [ -z "$DEBUG" ]; then outlvl="--quiet" ; else outlvl="--verbose"; fi yum $outlvl -c $YUMCONF -y --installroot=$YUMDIR install $RPMS 2>&1 || die "ERROR: could not install packages" if [ -n "$UPDATES" ]; then (cd $UPDATES; find) | (cd $UPDATES ; /bin/cpio --quiet -pmdu $YUMDIR) fi # figure out the theme to keep if [ -f $YUMDIR/etc/gtk-2.0/gtkrc ]; then gtktheme=$(grep "gtk-theme-name" $YUMDIR/etc/gtk-2.0/gtkrc | awk {'print $3;'} | sed -e 's/"//g') echo "usr/share/themes/$gtktheme" >> $KEEPFILES # find gtk engine needed for engine in `grep engine $YUMDIR/usr/share/themes/$gtktheme/gtk-2.0/gtkrc | awk {'print $2;'} | sed -e 's/"//g' | sort -u` ; do echo "usr/$LIBDIR/gtk-2.0/*/engines/*$engine*" >> $KEEPFILES done theme=$(grep "gtk-icon-theme-name" $YUMDIR/etc/gtk-2.0/gtkrc | awk {'print $3;'} | sed -e 's/"//g') while [ -n "$theme" ]; do echo "usr/share/icons/$theme" >> $KEEPFILES theme=$(grep Inherits $YUMDIR/usr/share/icons/$theme/index.theme | cut -d = -f 2) done fi echo `date` "Installing files" pushd $YUMDIR >/dev/null cat $KEEPFILES | while read spec ; do #Pull off path path=`echo "$spec" | sed 's,\([^[*\?]*\)/.*,\1,'` for filespec in `find ./$path -path "./$spec"` ; do if [ ! -e $filespec ]; then continue elif [ ! -d $filespec ]; then instFile $filespec $PKGDEST else for i in `find $filespec -type f` ; do instFile $i $PKGDEST ; done for i in `find $filespec -type l` ; do instFile $i $PKGDEST ; done for d in `find $filespec -type d` ; do instDir $d $PKGDEST ; done fi done done popd >/dev/null } die () { echo "$@" echo "Aborting instroot creation..." exit 1 } PACKAGES="glibc-common setup python newt slang libselinux libsepol libtermcap zlib ash e2fsprogs util-linux-ng raidtools popt procps rpm rpm-libs Xconfigurator anaconda tzdata python-libs anaconda-runtime kudzu hwdata bzip2 beecrypt mdadm libsemanage bzip2-libs dosfstools pciutils reiserfs-utils parted sed busybox-anaconda rpm-python booty hdparm lvm2 beecrypt rhpl pyxf86config libxml2 glib2 sqlite neon libselinux-python elfutils-libelf krb5-libs convertdb1 jfsutils audit-libs pam xfsprogs xfsdump dmapi libacl libattr attr acl python-urlgrabber policy policycoreutils pyparted xorg-x11 selinux-policy-targeted libstdc++ expat libgcc readline ncurses yum python-sqlite python-elementtree pykickstart e2fsprogs-libs iscsi-initiator-utils db4 rhpxl xorg-x11-server-Xorg libuser-python libuser system-config-date yum-metadata-parser gfs2-utils libvolume_id nash yum-fedorakmod libdhcp libnl libdhcp6client libdhcp4client newt-python nfs-utils device-mapper device-mapper-libs dmraid keyutils-libs libsemanage-python python-pyblock mkinitrd libbdevid libbdevid-python nss nspr pcre cryptsetup-luks libgcrypt libgpg-error dbus dbus-python hal cracklib-python module-init-tools cracklib-dicts" if [ $ARCH = i386 ]; then PACKAGES="$PACKAGES glibc.i386 openssl.i386" else PACKAGES="$PACKAGES glibc openssl" fi if [ $ARCH = i386 -o $ARCH = x86_64 ]; then PACKAGES="$PACKAGES pcmciautils grub" fi if [ $ARCH = i386 -o $ARCH = x86_64 -o $ARCH = ia64 ]; then PACKAGES="$PACKAGES dmidecode efibootmgr" fi if [ $ARCH = ia64 ]; then # XXX this needs to switch to grub at some point... PACKAGES="$PACKAGES elilo" fi if [ $ARCH = s390 -o $ARCH = s390x ]; then PACKAGES="$PACKAGES s390utils binutils libgcc tcp_wrappers sed net-tools openssh openssh-server coreutils login initscripts bash portmap pam login mount grep modutils gawk strace xorg-x11-xauth xorg-x11-libs" fi if [ $ARCH = ppc -o $ARCH = ppc64 ]; then PACKAGES="$PACKAGES pcmciautils pdisk yaboot hfsutils" fi # xpm is missing # Some packages are listed twice, but that's okay # # The packages in this list are needed for the graphical installer to run # # Extra stuff we want for rescue mode should go in PACKAGESRESCUE # PACKAGESGR="anaconda libpng gtk2 libglade2 fonts-ISO8859-2 fonts-ISO8859-9 e2fsprogs coreutils glibc-common popt specspo util-linux-ng rpm rpm-libs tzdata procps bash cpio gpm pygtk2-libglade pygobject2 Xconfigurator pygtk2 gdk-pixbuf libpixman reiserfs-utils atk pango freetype gnome-python2-canvas cairo libgnomecanvas libart_lgpl libgcc libacl libattr libstdc++ expat anaconda-images anaconda-help ttfonts-ko taipeifonts rhpl system-config-keyboard Xft fontconfig gtk2-engines gnome-themes gtkhtml2 gnome-python2-gtkhtml2 gail libthai ttfonts-ja ttfonts-zh_TW bitmap-fonts-cjk urw-fonts fonts-arabic comps-extras convertdb1 fonts-bengali vnc-server vnc-libs libjpeg tcp_wrappers system-config-date xfsprogs xfsdump dmapi attr acl policy policycoreutils selinux-policy-targeted ttfonts-zh_CN redhat-artwork xorg-x11-libs xorg-x11-ISO8859-2-75dpi-fonts echo-icon-theme xorg-x11-ISO8859-9-75dpi-fonts xorg-x11-100dpi-fonts xorg-x11-xfs xorg-x11 xorg-x11-KOI8-R xorg-x11-KOI8-R-75dpi-fonts xorg-x11-base-fonts xorg-x11-ISO8859-15-75dpi-fonts fonts-xorg-ISO8859-2-75dpi fonts-xorg-ISO8859-15-75dpi fonts-xorg-ISO8859-9-75dpi fonts-xorg-100dpi fonts-xorg-KOI8-R fonts-xorg-KOI8-R-75dpi fonts-xorg-base xorg-x11-base xorg-x11-ISO8859-15-75dpi system-logos xorg-x11-libs-data xorg-x11-xfs prelink redhat-logos fedora-logos ttfonts-ta ttfonts-bn ttfonts-gu ttfonts-hi ttfonts-pa fonts-chinese fonts-korean fonts-indic fonts-sinhala fonts-malayalam fonts-oriya fonts-kannada fonts-telugu cjkunifonts-ukai fonts-gujarati fonts-hindi fonts-punjabi fonts-tamil synaptics firstboot pycairo pirut dejavu-fonts libxcb VLGothic-fonts dmraid python-pyblock libbdevid libbdevid-python zenity udev dbus dbus-python hal" # # stuff ONLY included for rescue mode # # these packages are combined with the PACKAGES and PACKAGESGR for big stage 2 # PACKAGESRESCUE="bzip2 bzip2-libs dump libidn findutils ftp gzip iputils joe krb5-libs less man modutils mtools mt-st mtr net-tools open smartmontools openssh openssh-clients pciutils rsh traceroute tar rsync device-mapper device-mapper-libs dmraid ntfsprogs samba-client firstaidkit-plugin-all" if [ $ARCH = i386 -o $ARCH = x86_64 ]; then PACKAGESRESCUE="$PACKAGESRESCUE gpart grub" fi # turn off options we dont want, ie. set package list to something harmless if [ -z "$NEEDGR" ]; then PACKAGESGR="bash" PACKAGESRESCUE="bash" fi # # add bootloader for particular arch # if [ $ARCH = sparc ]; then PACKAGESGR="$PACKAGESGR tilo silo" fi if [ $ARCH = i386 -o $ARCH = x86_64 ]; then PACKAGESGR="$PACKAGESGR syslinux memtest86+ grub" fi if [ $ARCH = alpha ]; then PACKAGESGR="$PACKAGESGR aboot" fi if [ $ARCH = ia64 ]; then # XXX this needs to switch to grub at some point... PACKAGESGR="$PACKAGESGR elilo" fi if [ $ARCH = ppc ]; then PACKAGESGR="$PACKAGESGR fbset yaboot ppc64-utils" fi # dogtail stuff... PACKAGESGR="$PACKAGESGR gail at-spi libbonobo ORBit2 pyspi GConf2 dogtail libXevie libXtst gnome-python2-gconf" # modular xorg... XORGLIBS="libICE libSM libX11 libXcursor libXext libXfixes libXft libXi libxkbfile libXmu libXpm libXrandr libXrender libXt libXxf86misc libXaw liblbxutil libXfont libfontenc libXau libXdmcp libXfont libXinerama" XORGFONTS="xorg-x11-fonts-75dpi xorg-x11-fonts-base xorg-x11-fonts-cyrillic xorg-x11-fonts-ISO8859-15-75dpi xorg-x11-fonts-ISO8859-1-75dpi xorg-x11-fonts-ISO8859-2-75dpi xorg-x11-fonts-ISO8859-9-75dpi xorg-x11-fonts-misc xorg-x11-fonts-ethiopic" XORG="$XORGLIBS xorg-x11-drivers $XORGFONTS xorg-x11-server-Xorg xorg-x11-xauth xorg-x11-font-utils xorg-x11-xkb-utils xorg-x11-xkbdata xorg-x11-server-utils xkeyboard-config" PACKAGES="$PACKAGES $XORGDRIVERS" PACKAGESGR="$PACKAGESGR $XORG" # # KEEPFILE is all files to keep from the packages in PACKAGES # # This is what is present in http, ftp, and hard drive installs, and is # supposed to be a small image because these methods keep it in RAM. # # It also is the base on which the other install images build on top of, # so if something is needed by all images it should go here # KEEPFILE=${TMPDIR:-/tmp}/keepfile.$$ cat > $KEEPFILE <> $KEEPFILE <> $KEEPFILEGR <> $KEEPFILEGR < $KEEPFILERESCUE <> $KEEPFILERESCUE <<-EOF boot/grub sbin/grub sbin/grub-install sbin/grub-md5-crypt sbin/grub-set-default usr/bin/gpart usr/bin/mbchk usr/share/grub EOF fi echo "Assembling package list..." RPMS="$PACKAGES" [ -n "$DEBUG" ] && echo "RPMS are $RPMS" RPMSGR="$PACKAGES $PACKAGESGR $PACKAGESRESCUE" [ -n "$DEBUG" ] && echo "RPMSGR are $RPMSGR" rm -rf $DEST; mkdir -p $DEST/usr/sbin rm -rf $DESTGR; mkdir -p $DESTGR/usr/sbin $DESTGR/var/lib $DESTGR/boot ln -s /tmp $DESTGR/var/lib/xkb # # concat KEEPFILEGR and KEEPFILERESCUE lists # cat $KEEPFILERESCUE >> $KEEPFILEGR cat $KEEPFILE >> $KEEPFILEGR echo `date` "Expanding text packages..." YUMDIR=${TMPDIR:-/tmp}/yumdir.$$ mkdir -p $YUMDIR/var/log mkdir -p $YUMDIR/var/lib/yum expandPackageSet $yumconf $YUMDIR "$RPMS" $DEST $KEEPFILE echo `date` "Done Expanding text packages..." echo `date` "Expanding graphical packages..." expandPackageSet $yumconf $YUMDIR "$RPMSGR" $DESTGR $KEEPFILEGR echo `date` "Done Expanding graphical packages..." # more dogtail stuff if [ -n "$NEEDGR" ]; then # Dogtail will check this echo "Creating customized GConf2 settings for root" mkdir -p $DESTGR/.gconf/desktop/gnome/interface touch $DESTGR/.gconf/desktop/%gconf.xml touch $DESTGR/.gconf/desktop/gnome/%gconf.xml cat > $DESTGR/.gconf/desktop/gnome/interface/%gconf.xml < EOF fi rm -rf $YUMDIR chown -R root:root $DEST $DESTGR chmod -R a+rX-w $DEST $DESTGR # Remove locales unused during the install cat $DESTGR/usr/lib/anaconda/lang-table* | awk ' { gsub("-", "", $4); print $4; print gensub(/\..*$/,"","",$4); print gensub(/_.*$/,"","",$4); if (split ($4, a, ".") > 1) { print gensub(/\..*$/,tolower("." a[2]),"",$4); }; print $2; } ' | sed -e 's/latn/Latn/g' | LC_ALL=C sort -u > $DESTGR/locales for p in lib share; do ( cd $DESTGR/usr/$p/locale && { ls | grep -v locale.alias | grep -v locale-archive | LC_ALL=C sort > $DESTGR/locales.list LC_ALL=C comm -13 $DESTGR/locales $DESTGR/locales.list | xargs rm -rf } ); done rm -f $DESTGR/locales $DESTGR/locales.list # fixup joe links if [ -n "$NEEDGR" -a -d "$DESTDIR"/etc/joe ]; then ln -fs jpicorc $DESTGR/etc/joe/picorc ln -fs jpicorc $DESTGR/etc/joe/jnanorc ln -fs jpicorc $DESTGR/etc/joe/nanorc ln -fs jmacsrc $DESTGR/etc/joe/emacsrc ln -fs jmacs $DESTGR/usr/bin/emacs ln -fs jpico $DESTGR/usr/bin/pico ln -fs jpico $DESTGR/usr/bin/nano fi # fix up some links for man page related stuff for p in $DEST $DESTGR; do for file in nroff groff iconv geqn gtbl gpic grefer ; do ln -fs /mnt/sysimage/usr/bin/$file $p/usr/bin/$file done done # create selinux config if [ -e $DEST/etc/selinux/targeted ]; then cat > $DEST/etc/selinux/config < $DEST/etc/libuser.conf < ../../sbin/udevadm for brokenlink in $(find $p/usr/{bin,sbin} -follow -lname '*'); do target="$(readlink $brokenlink)" for pathbit in bin sbin; do # if it starts with "../../sbin/", remove that newtarget="${target##../../$pathbit/}" # if we removed something, replace it with the proper path if [ "$newtarget" != "$target" ]; then # make it ../sbin/ instead ln -sf "../$pathbit/$newtarget" "$brokenlink" fi done done # copy bootloader files for sparc if [ $ARCH = sparc -a $p = $DESTGR ]; then mkdir -p $p/usr/lib/anaconda-runtime/boot [ -d $p/boot ] || die "ERROR: directory missing: $p/boot" (cd $p/boot; find -name "*.b") | (cd $p/boot; /bin/cpio --quiet -pdmu $p/usr/lib/anaconda-runtime/boot) fi # copy bootloader file for ppc if [ $ARCH = ppc -o $ARCH = ppc64 ]; then mkdir -p $p/usr/lib/anaconda-runtime/boot cp -af $p/boot/efika.forth $p/usr/lib/anaconda-runtime/boot fi # copy bootloader file for alpha if [ $ARCH = alpha -a $p = $DESTGR ]; then mkdir -p $p/usr/lib/anaconda-runtime/boot cp -af $p/boot/bootlx $p/usr/lib/anaconda-runtime/boot fi # copy bootloader files for ia64 if [ $ARCH = ia64 -a $p = $DESTGR ]; then mkdir -p $p/usr/lib/anaconda-runtime/boot cp -af $p/boot/efi/EFI/redhat//* $p/usr/lib/anaconda-runtime/boot fi # copy bootloader files for i386/x86_64 if [ $ARCH = i386 -o $ARCH = x86_64 ]; then if [ $p = $DESTGR ]; then mkdir -p $p/usr/lib/anaconda-runtime/boot cp -af $p/boot/memtest* $p/usr/lib/anaconda-runtime/boot fi fi rm -rf $p/boot $p/home $p/root $p/tmp find $p -name "*.a" | grep -v kernel-wrapper/wrapper.a | xargs rm -rf find $p -name "lib*.la" |grep -v "usr/$LIBDIR/gtk-2.0" | xargs rm -rf # nuke some python stuff we don't need for d in idle distutils bsddb lib-old hotshot doctest.py pydoc.py site-packages/japanese site-packages/japanese.pth ; do rm -rf $p/$d done $p/usr/lib/anaconda-runtime/scrubtree $p done echo "Creating debug dir" for p in $DEST $DESTGR ; do mkdir -p $p/usr/lib/debug mkdir -p $p/usr/src/debug done for p in $DEST $DESTGR; do find $p -name "*.py" | while read fn; do rm -f ${fn}o rm -f ${fn}c ln -sf /dev/null ${fn}c done done # some python stuff we don't need for stage2 rm -rf $DESTGR/usr/$LIBDIR/python?.?/site-packages/distutils/ rm -rf $DESTGR/usr/$LIBDIR/python?.?/site-packages/lib-dynload/japanese rm -rf $DESTGR/usr/$LIBDIR/python?.?/site-packages/encodings/ rm -rf $DESTGR/usr/$LIBDIR/python?.?/site-packages/compiler/ rm -rf $DESTGR/usr/$LIBDIR/python?.?/site-packages/email/test/ rm -rf $DESTGR/usr/$LIBDIR/python?.?/site-packages/curses/ rm -rf $DESTGR/usr/$LIBDIR/python?.?/site-packages/pydoc.py # this is only for the minimal second stage echo "Cleaning ramdisk install images..." rm -rf $DEST/usr/lib/anaconda-runtime