#!/bin/bash

ORIGDIR=`pwd`
DEBUG=""
NEEDGR=yes

if [ "$1" == "--debug" ]; then
    DEBUG="--debug"
    shift
fi

if [ "$1" == "--nogr" ]; then
    NEEDGR=""
    shift
fi

if [ -z "$1" ]; then
	echo "upd-instroot: updates instimage from a Red Hat RPMS directory"
	echo "usage:        $0 <packagedir> [templatedir] [instroot]"
	exit 1
fi

if [ ! -d $1 ]; then
	if [ -z "$ARCH" ]; then
		echo "ARCH must be set" >&2
		exit 1
	fi
fi

PACKAGEDIR=$1

if [ -z "$ARCH" ]; then
	ARCH=`rpm --nodigest --nosignature -qp --qf "%{ARCH}" $PACKAGEDIR/anaconda-runtime*.rpm`
fi

if [ $ARCH = x86_64 -o $ARCH = s390x -o $ARCH = ppc64 ]; then
    LIBDIR=lib64
else
    LIBDIR=lib
fi

# pulled right out of mkinitrd....
DSO_DEPS=""
LDSO=""
get_dso_deps() {
    root="$1" ; shift
    bin="$1" ; shift
    DSO_DEPS=""

    declare -a FILES
    declare -a NAMES

    # this is a hack, but the only better way requires binutils or elfutils
    # be installed.  i.e., we need readelf to find the interpretter.
    if [ -z "$LDSO" ]; then
        for ldso in $root/lib*/ld*.so* ; do
            [ -L $ldso ] && continue
            [ -x $ldso ] || continue
            $ldso --verify $bin >/dev/null 2>&1 || continue
            LDSO=$(echo $ldso |sed -e "s,$root,,")
        done
    fi

    # I still hate shell.
    declare -i n=0
    while read NAME I0 FILE ADDR I1 ; do
        [ "$FILE" == "not" ] && FILE="$FILE $ADDR"
        NAMES[$n]="$NAME"
        FILES[$n]="$FILE"
        let n++
    done << EOF
        $(chroot $root env LD_TRACE_PRELINKING=1 LD_WARN= \
                           LD_TRACE_LOADED_OBJECTS=1 $LDSO $bin)
EOF

    [ ${#FILES[*]} -eq 0 ] && return 1

    # we don't want the name of the binary in the list
    if [ "${FILES[0]}" == "$bin" ]; then
        FILES[0]=""
        NAMES[0]=""
        [ ${#FILES[*]} -eq 1 ] && return 1
    fi

    declare -i n=0
    while [ $n -lt ${#FILES[*]} ]; do
        FILE="${FILES[$n]}"
        if [ "$FILE" == "not found" ]; then
            cat 1>&2 <<EOF
There are missing files on your system.  The dynamic object $bin
requires ${NAMES[$n]} n order to properly function.  mkinitrd cannot continue.
EOF
            exit 1
        fi
       case "$FILE" in
         /lib*)
           TLIBDIR=`echo "$FILE" | sed 's,\(/lib[^/]*\)/.*$,\1,'`
           BASE=`basename "$FILE"`
           # Prefer nosegneg libs over direct segment accesses on i686.
           if [ -f "$TLIBDIR/i686/nosegneg/$BASE" ]; then
             FILE="$TLIBDIR/i686/nosegneg/$BASE"
           # Otherwise, prefer base libraries rather than their optimized
           # variants.
           elif [ -f "$TLIBDIR/$BASE" ]; then
             FILE="$TLIBDIR/$BASE"
           fi
           ;;
       esac
        dynamic="yes"
        let n++
    done

    DSO_DEPS="${FILES[@]}"

    for l in $(chroot $root find /lib* -maxdepth 1 -type l -name ld*.so*); do
       [ "$(chroot $root readlink -f $l)" == "$LDSO" ] && DSO_DEPS="$DSO_DEPS $l"
    done

    [ -n "$DEBUG" ] && echo "DSO_DEPS for $bin are $DSO_DEPS"
}

instFile() {
    FILE=$1
    DESTROOT=$2

    [ -n "$DEBUG" ] && echo "Installing $FILE"
    if [ -e $DESTROOT/$FILE -o -L $DESTROOT/$FILE ]; then
      return
    elif [ ! -d $DESTROOT/`dirname $FILE` ]; then
      mkdir -p $DESTROOT/`dirname $FILE`
    fi
    if [ -L $FILE ]; then
	cp -al $FILE $DESTROOT/`dirname $FILE`
	instFile ./`dirname $FILE`/`readlink $FILE` $DESTROOT
	return
    else
	cp -aL $FILE $DESTROOT/`dirname $FILE`
    fi

    get_dso_deps $(pwd) "$FILE"
    local DEPS="$DSO_DEPS"
    for x in $DEPS ; do 
      instFile ./$x $DESTROOT
    done
}

instDir() {
    DIR=$1
    DESTROOT=$2

    echo "Installing $DIR"
    if [ -d $DESTROOT/$DIR -o -h $DESTROOT/$DIR ]; then
      return
    fi
    cp -a --parents $DIR $DESTROOT/
}

expandPackageSet() {
    YUMCONF=$1
    YUMDIR=$2
    RPMS=$3
    PKGDEST=$4
    KEEPFILES=$5

    [ -d $PKGDEST ] || die "ERROR: directory missing: $PKGDEST"
    yum -c $YUMCONF -y --installroot=$YUMDIR install $RPMS 2>&1 || die "ERROR: could not install packages"

    # 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
}

if [ -z "$2" ]; then
    DEST=${TMPDIR:-/tmp}/upd-instroot
else
    DEST=$2
fi

if [ -z "$3" ]; then
    DESTGR=${TMPDIR:-/tmp}/upd-instroot
else
    DESTGR=$3
fi

if [ -n "$4" ]; then
    TOPDIR=$4
elif [ -d $PACKAGEDIR/repodata ]; then
    TOPDIR=$PACKAGEDIR
elif [ -d $PACKAGEDIR/../repodata ]; then
    TOPDIR=$PACKAGEDIR/..
elif [ -d $PACKAGEDIR/../../repodata ]; then
    TOPDIR=$PACKAGEDIR/../..
else
    echo "Unable to find repodata!"
    exit 1
fi


rm -rf $DEST $DESTGR
mkdir -p $DEST
mkdir -p $DESTGR

PACKAGES="glibc-common setup python newt slang libselinux
	 libsepol libtermcap zlib ash e2fsprogs util-linux 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
	 device-mapper device-mapper-libs dmraid keyutils-libs libsemanage-python
	 python-pyblock mkinitrd libbdevid libbdevid-python nss nspr pcre
	 cryptsetup-luks libgcrypt libgpg-error udev udev-static dbus dbus-python hal"

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"
fi

if [ $ARCH = i386 -o $ARCH = x86_64 -o $ARCH = ia64 ]; then
    PACKAGES="$PACKAGES dmidecode"
fi

if [ $ARCH = ia64 ]; then
    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 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-japanese 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 sazanami-fonts-gothic
           dmraid python-pyblock libbdevid libbdevid-python zenity udev udev-static 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 groff
                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"

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+" 
fi

if [ $ARCH = alpha ]; then
    PACKAGESGR="$PACKAGESGR aboot"
fi

if [ $ARCH = ia64 ]; then
    PACKAGESGR="$PACKAGESGR elilo"
fi

if [ $ARCH = ppc ]; then
    PACKAGESGR="$PACKAGESGR fbset yaboot ppc64-utils"
fi

# dogtail stuff...
PACKAGESGR="$PACKAGESGR gail at-spi libbonobo ORBit2"

# 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 <<EOF
boot/efi/EFI/redhat/elilo.efi
bin/ash
bin/dbus-daemon
bin/fdisk*
bin/mkfs*
bin/sed
etc/dbus-1
etc/group
etc/hal
etc/passwd
etc/iscsid.conf
etc/mke2fs.conf
etc/pcmcia
etc/PolicyKit
etc/protocols
etc/services
etc/selinux/targeted/booleans
etc/selinux/targeted/policy/policy.*
etc/selinux/targeted/contexts/files
etc/selinux/targeted/contexts
etc/selinux/targeted
usr/share/selinux/targeted
etc/security/selinux/policy.*
etc/security/selinux/file_contexts
etc/udev
etc/yum/pluginconf.d/fedorakmod.conf
lib/terminfo
$LIBDIR/libnss_dns*
$LIBDIR/libnss_files*
$LIBDIR/dbus-1
sbin/badblocks
sbin/busybox.anaconda
sbin/clock
sbin/cryptsetup
sbin/debugfs
sbin/dosfslabel
sbin/dumpe2fs
sbin/e2fsck
sbin/e2fsadm
sbin/e2label
sbin/fsck.ext2
sbin/fsck.ext3
sbin/fsck.jfs
sbin/fsck.xfs
sbin/fdisk
sbin/hdparm
sbin/hwclock
sbin/jfs_tune
sbin/ldconfig
sbin/lvm*
sbin/mdadm
sbin/mkdosfs
sbin/mke2fs
sbin/mkfs.ext2
sbin/mkfs.ext3
sbin/mkfs.jfs
sbin/mkfs.xfs
sbin/mkfs.msdos
sbin/mkfs.vfat
sbin/mkreiserfs
sbin/mkraid
sbin/mkswap
sbin/parted
sbin/pcmcia-socket-startup
sbin/pdisk
sbin/probe
sbin/reiserfstune
sbin/resize2fs
sbin/tune2fs
sbin/xfsdump
sbin/xfsrestore
sbin/xfs_repair
usr/sbin/xfs_db
usr/sbin/xfs_check
usr/sbin/xfs_copy
sbin/*gfs*
sbin/iscsid
sbin/iscsiadm
sbin/iscsistart
sbin/udevd.static
usr/bin/lshal
usr/bin/python
usr/bin/python?.?
usr/bin/hmount
usr/bin/humount
usr/bin/hcopy
usr/bin/hattrib
usr/bin/hformat
usr/bin/udevinfo
usr/lib/anaconda-runtime
usr/lib/anaconda
usr/lib/anaconda/installclasses
usr/lib/anaconda/textw
usr/lib/booty
usr/$LIBDIR/hal
usr/$LIBDIR/python?.?
usr/$LIBDIR/python?.?/email
usr/$LIBDIR/python?.?/xml/etree/
usr/$LIBDIR/python?.?/site-packages/_dbus*
usr/$LIBDIR/python?.?/site-packages/*kudzu*
usr/$LIBDIR/python?.?/site-packages/bdevid.so
usr/$LIBDIR/python?.?/site-packages/rpmmodule.so
usr/$LIBDIR/python?.?/site-packages/partedmodule.so
usr/$LIBDIR/python?.?/site-packages/ixf86configmodule.so
usr/$LIBDIR/python?.?/site-packages/xf86config.py
usr/$LIBDIR/python?.?/site-packages/libusermodule.so
usr/$LIBDIR/python?.?/site-packages/*sqlite*
usr/$LIBDIR/python?.?/site-packages/rhpl
usr/$LIBDIR/python?.?/site-packages/cElementTree.so
usr/$LIBDIR/python?.?/site-packages/block
usr/$LIBDIR/python?.?/site-packages/*.pth
usr/$LIBDIR/python?.?/site-packages/*selinux*
usr/lib/locale
usr/lib/python?.?/site-packages/dbus
usr/lib/python?.?/site-packages/dbus_bindings.py*
usr/lib/python?.?/site-packages/elementtree
usr/lib/python?.?/site-packages/iniparse
usr/lib/python?.?/site-packages/rpmUtils
usr/lib/python?.?/site-packages/urlgrabber
usr/lib/python?.?/site-packages/yum
usr/lib/python?.?/site-packages/repomd
usr/lib/python?.?/site-packages/pirut
usr/lib/python?.?/site-packages/pykickstart
usr/lib/python?.?/site-packages/rhpxl
usr/lib/rpm/macros
usr/lib/rpm/rpmpopt
usr/lib/rpm/rpmrc
boot/efika.forth
usr/lib/yaboot/addnote
usr/lib/yaboot/ofboot
usr/lib/yaboot/yaboot
usr/lib/yum-plugins/fedorakmod.py*
usr/$LIBDIR/libfreebl3.so
usr/$LIBDIR/libnss3.so
usr/$LIBDIR/libnssckbi.so
usr/$LIBDIR/libnsspem.so
usr/$LIBDIR/libsmime3.so
usr/$LIBDIR/libsoftokn3.so
usr/$LIBDIR/libssl3.so
usr/$LIBDIR/libuser/*
usr/libexec/convertdb1
usr/libexec/hal*
usr/libexec/polkit*
usr/share/dbus-1
usr/share/hal
usr/share/PolicyKit
usr/share/locale/*/LC_MESSAGES/anaconda.mo
usr/share/locale/*/LC_MESSAGES/system-config-date.mo
usr/share/locale/locale.alias
usr/sbin/anaconda
usr/sbin/ddcprobe
usr/sbin/dmidecode
usr/sbin/hald
usr/sbin/mkofboot
usr/sbin/ofpath
usr/sbin/ybin
usr/sbin/load_policy
usr/sbin/semodule
usr/sbin/genhomedircon
sbin/setfiles
usr/sbin/lvm
usr/sbin/gptsync
usr/sbin/showpart
usr/share/anaconda/anaconda.conf
usr/share/selinux/targeted/base.pp
usr/share/system-config-date/zonetab.py*
usr/share/terminfo/l/linux
usr/share/terminfo/v/vt100
usr/share/terminfo/v/vt100-nav
usr/share/hwdata/pci.ids
usr/share/hwdata/videoaliases
usr/share/hwdata/videoaliases
usr/share/hwdata/videodrivers
usr/share/hwdata/MonitorsDB
usr/share/xorg/extramodes
usr/share/xorg/vesamodes
usr/share/zoneinfo/zone.tab
var/lib/dbus
var/lib/hal
var/lib/PolicyKit*
var/lib/misc/PolicyKit*
var/run/dbus
var/run/PolicyKit
var/cache/hald
EOF

if [ $ARCH = s390 -o $ARCH = s390x ]; then
    cat >> $KEEPFILE <<EOF
usr/share/terminfo/a/ansi
usr/share/terminfo/d/dumb
usr/share/terminfo/k/kterm
usr/share/terminfo/s/screen
usr/share/terminfo/v/vt102
usr/share/terminfo/x/xterm
usr/share/terminfo/x/xterm-color
usr/bin/strace
usr/bin/ldd
usr/sbin/chroot
usr/sbin/sshd
usr/sbin/glibc_post_upgrade
sbin/cmsfslst
sbin/cmsfscat
sbin/busybox.anaconda
sbin/ifconfig
sbin/route
sbin/portmap
sbin/fdasd
sbin/dasdfmt
sbin/swapon
sbin/swapoff
sbin/mkswap
bin/bash
bin/dd
bin/gawk
bin/mount
bin/umount
bin/mknod
bin/sleep
bin/login
bin/cat
bin/chmod
bin/sort
lib/modules/ibm
etc/pam.d/sshd
etc/pam.d/other
etc/security/limits.conf
etc/security/pam_env.conf
lib/security
$LIBDIR/security/pam_*
usr/bin/xauth
EOF
fi

#
# KEEPFILEGR is all files to keep from the packages in PACKAGESGR
#
# This defines the files in addition to KEEPFILE that make up the install
# images for NFS and CD/DVD based installs.  This image is not loaded into
# memory so it can be considerably larger.
#
# The rescue mode of anaconda uses these files as well as those defined
# by KEEPFILERESCUE below.  The total size of this image should be
# under the size of the miniature CD used for the rescue CD (around 68MB).
#
KEEPFILEGR=${TMPDIR:-/tmp}/keepfilegr.$$
cp $KEEPFILE $KEEPFILEGR
cat >> $KEEPFILEGR <<EOF
boot/efi/EFI/redhat/elilo.efi
boot/memtest86*
bin/bash
bin/cat
bin/chmod
bin/cp
bin/cpio
bin/dd
bin/df
bin/du
bin/ln
bin/ls
bin/mkdir
bin/mv
bin/ps
bin/rm
bin/rpm
bin/touch
boot/*.b
boot/bootlx
etc/fb.modes
etc/gtk-2.0/gtkrc*
etc/im_palette.pal
etc/imrc
etc/man.config
etc/pango
etc/fonts
etc/prelink.conf
etc/rpm/macros.prelink
$LIBDIR/bdevid
sbin/debugfs
sbin/e2fsck
sbin/e2label
sbin/reiserfsck
sbin/reiserfstune
sbin/fsck
sbin/fsck.ext2
sbin/fsck.ext3
sbin/fsck.jfs
sbin/fsck.reiserfs
sbin/parted
sbin/silo
sbin/tune2fs
usr/bin/Xorg
usr/bin/setxkbmap
usr/bin/xkbcomp
usr/share/X11/XKeysymDB
usr/share/X11/fonts/misc/6x13*
usr/share/X11/fonts/misc/fonts*
usr/share/X11/fonts/misc/cursor*
usr/share/X11/fonts/misc/olcursor*
usr/share/X11/fonts/Type1/l047013t*
usr/share/X11/fonts/Type1
usr/share/X11/fonts/TTF/GohaTibebZemen.ttf
usr/share/X11/locale
usr/share/X11/rgb*
usr/share/X11/xkb
usr/$LIBDIR/xserver/SecurityPolicy
usr/$LIBDIR/xorg/modules
usr/bin/chattr*
usr/bin/fc-cache
usr/bin/gdialog
usr/bin/gtk-query*
usr/bin/gdk-pixbuf-query-loaders*
usr/bin/gtk-update-icon-cache*
usr/bin/head
usr/bin/lsattr*
usr/bin/maketilo
usr/bin/mini-wm
usr/bin/pango*
usr/bin/syslinux
usr/bin/mkzimage
usr/bin/tac
usr/bin/tail
usr/bin/tilo
usr/bin/uniq
usr/bin/zenity
usr/bin/Xvnc
usr/bin/vncconfig
usr/bin/vncpasswd
usr/bin/reduce-font
usr/lib/anaconda/iw
usr/$LIBDIR/gconv
usr/$LIBDIR/gdk-pixbuf/loaders/*xpm*
usr/$LIBDIR/gdk-pixbuf/loaders/*png*
usr/$LIBDIR/gdk-pixbuf/loaders/*la*
usr/$LIBDIR/gtk-2.0/*/engines/libclearlooks.so
usr/$LIBDIR/gtk-2.0/*/loaders/*xpm*
usr/$LIBDIR/gtk-2.0/*/loaders/*png*
usr/$LIBDIR/gtk-2.0/*/loaders/*la*
usr/$LIBDIR/gtk-2.0/immodules
usr/$LIBDIR/pango
usr/$LIBDIR/python?.?/site-packages/cairo
usr/$LIBDIR/python?.?/site-packages/gtk*/gtk
usr/$LIBDIR/python?.?/site-packages/gtk*
usr/$LIBDIR/rpm/rpmpopt
usr/lib/syslinux
usr/lib/kernel-wrapper
boot/efika.forth
usr/lib/yaboot
usr/sbin/addRamDisk
usr/sbin/wrapper
usr/sbin/chroot
usr/sbin/ddcprobe
usr/sbin/fbset
usr/sbin/prelink
usr/sbin/smartctl
usr/share/anaconda
usr/share/firstboot/firstboot_module_window*
usr/share/fonts/dejavu/DejaVuSans.ttf
usr/share/fonts/dejavu/DejaVuSans-Bold.ttf
usr/share/fonts/dejavu/DejaVuSansMono.ttf
usr/share/fonts/korean/TrueType/dotum.ttf
usr/share/fonts/baekmuk-ttf-dotum/dotum.ttf
usr/share/fonts/japanese/TrueType/sazanami-gothic.ttf
usr/share/fonts/sazanami-fonts-gothic/sazanami-gothic.ttf
usr/share/fonts/chinese/TrueType/uming*.ttf
usr/share/fonts/cjkunifonts-uming/uming*.ttf
usr/share/fonts/arabic/KacstFarsi.ttf
usr/share/fonts/arabic/KacstQura.ttf
usr/share/fonts/*/lohit_ta.ttf
usr/share/fonts/*/lohit_gu.ttf
usr/share/fonts/*/lohit_bn.ttf
usr/share/fonts/*/lohit_hi.ttf
usr/share/fonts/*/lohit_pa.ttf
usr/share/fonts/*/lohit_or.ttf
usr/share/fonts/*/lohit_ml.ttf
usr/share/fonts/*/lohit_kn.ttf
usr/share/fonts/*/lohit_te.ttf
usr/share/fonts/*/lklug.ttf
usr/share/locale/*/LC_MESSAGES/anaconda.mo
usr/share/locale/*/LC_MESSAGES/system-config-date.mo
usr/share/locale/*/LC_MESSAGES/redhat-dist.mo
usr/share/locale/*/LC_MESSAGES/system-config-keyboard.mo
usr/share/locale/*/LC_MESSAGES/gtk20.mo
usr/share/locale/*/LC_MESSAGES/libc.mo
usr/share/locale/*/LC_MESSAGES/rhpl.mo
usr/share/locale/*/LC_MESSAGES/rhpxl.mo
usr/share/locale/*/LC_MESSAGES/parted.mo
usr/share/locale/*/LC_MESSAGES/pirut.mo
usr/share/locale/*/LC_MESSAGES/zenity.mo
usr/share/pirut
usr/share/pixmaps/comps/*.png
usr/share/pixmaps/gnome-default-dlg.png
usr/share/pixmaps/gnome-error.png
usr/share/pixmaps/gnome-info.png
usr/share/pixmaps/gnome-question.png
usr/share/pixmaps/gnome-warning.png
usr/share/pixmaps/no.xpm
usr/share/pixmaps/yes.xpm
usr/share/ppc64-utils
usr/share/system-config-keyboard
usr/share/system-config-date
usr/share/terminfo/x/xterm
usr/share/vte/termcap/xterm
usr/share/zenity
usr/share/zoneinfo/zone.tab
EOF

TIMEZONES="
usr/share/zoneinfo/Africa
usr/share/zoneinfo/America
usr/share/zoneinfo/Antarctica
usr/share/zoneinfo/Arctic
usr/share/zoneinfo/Asia
usr/share/zoneinfo/Atlantic
usr/share/zoneinfo/Australia
usr/share/zoneinfo/Canada
usr/share/zoneinfo/Europe
usr/share/zoneinfo/Indian
usr/share/zoneinfo/Japan
usr/share/zoneinfo/Mideast
usr/share/zoneinfo/Pacific
usr/share/zoneinfo/US
"

# more dogtail stuff...
cat >> $KEEPFILEGR <<EOF
usr/$LIBDIR/gtk-2.0/modules/libatk-bridge.so
usr/$LIBDIR/gtk-2.0/modules/libgail.so
usr/libexec/bonobo-activation-server
usr/libexec/at-spi-registryd
usr/$LIBDIR/bonobo/servers
EOF



#
# KEEPFILERESCUE is all files to keep from the packages in PACKAGESRESCUE
#
# This defines the files in addition to KEEPFILE and KEEPFILEGR that make up 
# the install images for NFS and CD/DVD based rescue mode installs.  This 
# image is not loaded into memory so it can be considerably larger.
#
# NOTE: hd, ftp, and http rescue mode use and image based on KEEPFILE since
#       it has to be much smaller due to memory usage.
#
KEEPFILERESCUE=${TMPDIR:-/tmp}/keepfilerescue.$$
cat > $KEEPFILERESCUE <<EOF
bin/gunzip
bin/gzip
bin/mt
bin/ping
bin/sync
bin/tar
bin/zcat
etc/joe
sbin/arp
sbin/depmod
sbin/dmraid.static
sbin/dmsetup.static
sbin/dump
sbin/ifconfig
sbin/insmod
sbin/lsmod
sbin/lspci
sbin/modinfo
sbin/modprobe
sbin/netstat
sbin/restore
sbin/rrestore
sbin/rmmod
sbin/route
sbin/mount.cifs
sbin/umount.cifs
usr/bin/bunzip2
usr/bin/bzcat
usr/bin/bzip2
usr/bin/emacs
usr/bin/find
usr/bin/ftp
usr/bin/jmacs
usr/bin/joe
usr/bin/jpico
usr/bin/less
usr/bin/mattrib
usr/bin/mbadblocks
usr/bin/mcd
usr/bin/mcopy
usr/bin/mdel
usr/bin/mdeltree
usr/bin/mdir
usr/bin/mdu
usr/bin/mformat
usr/bin/minfo
usr/bin/mlabel
usr/bin/mmd
usr/bin/mmount
usr/bin/mmove
usr/bin/mpartition
usr/bin/mrd
usr/bin/mread
usr/bin/mren
usr/bin/mshowfat
usr/bin/mtools
usr/bin/mtype
usr/bin/mzip
usr/bin/open
usr/bin/rcp
usr/bin/rlogin
usr/bin/rsh
usr/bin/rsync
usr/bin/scp
usr/bin/sftp
usr/bin/shred
usr/bin/ssh
usr/bin/termidx
usr/bin/xargs
usr/bin/groff
usr/bin/iconv
usr/bin/ntfscat
usr/bin/ntfscluster
usr/bin/ntfscmp
usr/bin/ntfsdecrypt
usr/bin/ntfsdump_logfile
usr/bin/ntfsfix
usr/bin/ntfsinfo
usr/bin/ntfsls
usr/bin/ntfsmftalloc
usr/bin/ntfsmove
usr/bin/ntfstruncate
usr/bin/ntfswipe
usr/sbin/mkntfs
usr/sbin/ntfsclone
usr/sbin/ntfscp
usr/sbin/ntfslabel
usr/sbin/ntfsresize
usr/sbin/ntfsundelete
usr/sbin/mtr
usr/sbin/smartctl
usr/sbin/traceroute
EOF

if [ $ARCH = i386 -o $ARCH = x86_64 ]; then
    cat >> $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

yumconf=$(mktemp /tmp/yum.conf.XXXXXX)
cat > $yumconf <<EOF 
[main]
keepcache=0
gpgcheck=0
plugins=0
reposdir=
tsflags=nodocs

[anacondarepo]
name=anaconda repo
baseurl=file://$TOPDIR
enabled=1
EOF

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..."

#(cd $DEST; tar cSpf - .) | (cd $DESTGR; tar xSpf -)

echo `date` "Expanding graphical packages..."
expandPackageSet $yumconf $YUMDIR "$RPMSGR" $DESTGR $KEEPFILEGR
echo `date` "Done Expanding graphical packages..."

rm -rf $yumconf $YUMDIR

# echo "retrieving timezones"
# TZDIR=${TMPDIR:-/tmp}/glibc-timezone-$$
# mkdir -p $TZDIR/usr/share/zoneinfo
# rpm2cpio $TZDATA | (cd $TZDIR; cpio --quiet -iumd usr/share/zoneinfo ./usr/share/zoneinfo ./usr/share/zoneinfo/* usr/share/zoneinfo/*)
# [ $? = 0 ] || die "ERROR: Unable to expand timezone data ($TZDATA)"
# (cd $TZDIR; tar cSpf - $TIMEZONES) | (cd $DEST; tar xSpf -)
# (cd $TZDIR; tar cSpf - $TIMEZONES) | (cd $DESTGR; tar xSpf -)

chown -R root:root $DEST $DESTGR
chmod -R a+rX-w $DEST $DESTGR
if [ $ARCH = s390 -o $ARCH = s390x ]; then
    for i in $DEST $DESTGR; do
	mv $i/bin/sed $i/bin/sed_save
	mv $i/bin/sort $i/bin/sort_save
    done
fi

for i in $DEST $DESTGR; do
    # there's never a case with only one of these...
    if [ -f $i/sbin/dmraid.static ]; then
        mv $i/sbin/dmraid.static $i/sbin/dmraid
        mv $i/sbin/dmsetup.static $i/sbin/dmsetup
    fi
done

# change mtimes to 0 (to match what happens on the cramfs)
for p in $DEST $DESTGR; do
    $p/usr/lib/anaconda-runtime/fixmtime.py $DEBUG $p
done

# for p in $DEST $DESTGR; do
#    if [ -f $p/usr/lib/locale/locale-archive.tmpl ]; then
#       mv $p/usr/lib/locale/locale-archive.tmpl $p/usr/lib/locale/locale-archive
#    fi
# done

# 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

# create selinux config
if [ -e $DEST/etc/selinux/targeted ]; then
  cat > $DEST/etc/selinux/config <<EOF
SELINUX=permissive
SELINUXTYPE=targeted
EOF
  cp $DEST/etc/selinux/config $DESTGR/etc/selinux/config
fi

cat > $DEST/etc/shells <<EOF
/bin/sh
EOF

echo "Creating nsswitch.conf"
cat > $DEST/etc/nsswitch.conf <<EOF
# munged nsswitch.conf with just what anaconda needs
# created by upd-instroot
#
passwd:     files
shadow:     files
group:      files
hosts:      files dns
ethers:     files
netmasks:   files
networks:   files
protocols:  files
rpc:        files
services:   files
netgroup:   files
automount:  files
aliases:    files
EOF

echo "Creating libuser.conf"
cat > $DEST/etc/libuser.conf <<EOF
[defaults]
skeleton = /mnt/sysimage/etc/skel
mailspooldir = /mnt/sysimage/var/mail
crypt_style = md5
modules = files shadow
create_modules = files shadow
[files]
directory = /mnt/sysimage/etc
[shadow]
directory = /mnt/sysimage/etc
EOF

cp $DEST/etc/shells $DESTGR/etc/shells
cp $DEST/etc/nsswitch.conf $DESTGR/etc/nsswitch.conf
cp $DEST/etc/libuser.conf $DESTGR/etc/libuser.conf

sed -i 's|\(installforallkernels\) = 0|\1 = 1|' $DEST/etc/yum/pluginconf.d/fedorakmod.conf
cp $DEST/etc/yum/pluginconf.d/fedorakmod.conf $DESTGR/etc/yum/pluginconf.d/

# fixup man.config to point into /mnt/sysimage for rescue
if [ -n "$NEEDGR" ]; then
    echo "Fixing up /etc/man.config to point into /mnt/sysimage"
    mv $DESTGR/etc/man.config $DESTGR/etc/man.config-old
    cat $DESTGR/etc/man.config-old | sed 's^/usr/bin^/mnt/sysimage/usr/bin^' | sed 's^/bin/cat^/mnt/sysimage/usr/bin/cat^'  > $DESTGR/etc/man.config
    rm -f $DESTGR/etc/man.config-old
fi

if [ -n "$NEEDGR" ]; then
    echo "Running mkfontdir..."
    mkfontdir $DESTGR/usr/share/X11/fonts/*
fi

echo "Creating SELinux policy..."
if [ -x $DESTGR/usr/sbin/semodule ]; then
    ( cd $DESTGR
      x=$(ls usr/share/selinux/targeted/*.pp | grep -v -e base.pp -e enableaudit.pp | awk '{ print "-i /" $1 }')
    /usr/sbin/chroot $DESTGR /usr/sbin/semodule -b /usr/share/selinux/targeted/base.pp $x -n -s targeted )
fi
rm -rf $DEST/etc/selinux
rm -rf $DEST/usr/share/selinux $DESTGR/usr/share/selinux
mkdir $DEST/etc/selinux
cp -r $DESTGR/etc/selinux/* $DEST/etc/selinux/

rm -f $KEEPFILE $KEEPFILEGR $KEEPFILERESCUE

for p in $DEST $DESTGR; do
	echo "Scrubbing trees..." "$p"
	cp $p/usr/lib/anaconda/raidstart-stub $p/usr/bin/raidstart
	cp $p/usr/lib/anaconda/raidstop-stub $p/usr/bin/raidstop
	cp $p/usr/lib/anaconda/losetup-stub $p/usr/bin/losetup
	cp $p/usr/lib/anaconda/dhcpclient-stub $p/usr/bin/dhcpclient
	( cd $p/usr/bin && rm -f pump && ln -sf dhcpclient pump )
	cp $p/usr/lib/anaconda/list-harddrives-stub $p/usr/bin/list-harddrives
	cp $p/usr/lib/anaconda/kudzu-probe-stub $p/usr/bin/kudzu-probe
	cp $p/usr/lib/anaconda/loadkeys-stub $p/usr/bin/loadkeys
	cp $p/usr/lib/anaconda/mknod-stub $p/usr/bin/mknod
	cp $p/usr/lib/anaconda/syslogd-stub $p/usr/bin/syslogd
	mv $p/usr/sbin/anaconda $p/usr/bin/anaconda
	mv $p/usr/lib/anaconda-runtime/lib* $p/usr/$LIBDIR

	# we only want the libunicode-lite stuff on the minimal image
	if [ $p = $DESTGR ]; then
	    rm -f $p/usr/$LIBDIR/libunicode-lite*
	fi

	find $p -type d | xargs chmod 755

	if [ -f $p/bin/bash ]; then
	    rm -f $p/bin/ash
	    ln -s bash $p/bin/sh
	else
	    ln -sf busybox $p/bin/sh
	fi

	[ -d $p/bin ] || die "ERROR: directory missing: $p/bin"
	[ -d $p/sbin ] || die "ERROR: directory missing: $p/sbin"
	(cd $p/bin; find) | (cd $p/bin; /bin/cpio --quiet -pdmu $p/usr/bin)
	(cd $p/sbin; find) | (cd $p/sbin; /bin/cpio --quiet -pdmu $p/usr/sbin)
	rm -rf $p/bin
	rm -rf $p/sbin

	# 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
	for f in newt popt rpm rpmio; do
	    rm -f $p/usr/$LIBDIR/lib$f.so
	done

	# 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

	if [ "$ARCH" != "s390" -a "$ARCH" != "s390x" ]; then
	   (cd $p/lib* && rm -f libnss_files.so.1 libnss_dns.so.1)
	fi

	if [ -d $DEST/usr/share/zoneinfo ]; then
	    (cd $DEST/usr/share/zoneinfo; find . -type f -or -type l | 
		grep '^./[A-Z]' | sort | sed 's/^..//' | 
		gzip -9) > $p/usr/lib/timezones.gz
	else
	    echo "ERROR: unable to explode tzdata for small images"
	fi

	$p/usr/lib/anaconda-runtime/scrubtree $p
done

echo "Compressing .mo files in stage2 images..."
if [ -d $DEST/usr/share/locale ]; then
    for i in `find $DEST/usr/share/locale -name anaconda.mo`; do
	gzip -9 $i
	mv -f $i.gz $i
    done
fi

if [ -n "$NEEDGR" ]; then
    echo "Creating fontconfig cache"
    /usr/sbin/chroot $DESTGR /usr/bin/fc-cache
    rm -f $DESTGR/usr/bin/fc-cache
fi

echo "Creating debug dir"
for p in $DEST $DESTGR ; do
    mkdir -p $p/usr/lib/debug
    mkdir -p $p/usr/src/debug
done

if [ $ARCH = "alpha" ]; then
    rm -rf $DEST/usr/share/locale
    rm -rf $DEST/usr/$LIBDIR/locale
fi

echo "Patching python library..."

# always use passive mode for ftp installs
cd $DEST/usr/$LIBDIR/python*
patch -p0 > /dev/null <<EOF
--- urllib.py.orig	Thu Oct 25 17:05:06 2001
+++ urllib.py	Thu Oct 25 17:05:34 2001
@@ -453,6 +453,7 @@
         path, attrs = splitattr(path)
         path = unquote(path)
         dirs = path.split('/')
+        dirs[0] = '/' + dirs[0]
         dirs, file = dirs[:-1], dirs[-1]
         if dirs and not dirs[0]: dirs = dirs[1:]
         if dirs and not dirs[0]: dirs[0] = '/'
@@ -707,6 +708,7 @@
         self.ftp = ftplib.FTP()
         self.ftp.connect(self.host, self.port)
         self.ftp.login(self.user, self.passwd)
+        self.ftp.set_pasv(1)
         for dir in self.dirs:
             self.ftp.cwd(dir)
EOF
cd -

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

# clean up tzdata
rm -rf $TZDIR

# this is only for the minimal second stage
echo "Cleaning ramdisk install images..."
rm -rf $DEST/usr/lib/anaconda-runtime
