+ if [ $UID -ne 0 ] ; then
+ echo "Error: You must run this script as root."
+ exit 1
+ fi
+
+# Verbosity
+ verbose=0
+
+# Release and architecture to install : defaults to current vserver's settings or previously parsed fedora_options
+ releasever=$pl_DISTRO_RELEASE
+ basearch=$pl_DISTRO_ARCH
+
+# Get options
+ mirrors=""
+ while getopts "l:r:a:vh" opt ; do
+ case $opt in
+ l)
+ mirrors="$mirrors $OPTARG"
+ ;;
+ r)
+ releasever=$OPTARG
+ ;;
+ a)
+ basearch=$OPTARG
+ ;;
+ v)
+ verbose=1
+ set -x
+ ;;
+ h|*)
+ mkfedora_usage
+ ;;
+ esac
+ done
+
+ shift $(($OPTIND - 1))
+ [[ "$#" -lt 3 ]] && mkfedora_usage
+ vroot=$1 ; shift
+ pldistro=$1 ; shift
+ pkgsfile="$@"
+ vroot=$(cd $vroot && pwd -P)
+ [ -d $vroot ] || mkfedora_usage
+
+
+ # parse pkgsfile and add to local vars
+ fcdistro=${pl_DISTRO_NAME}
+ pkgs_packages=$(pl_parsePkgs package $fcdistro $pldistro $pkgsfile)
+ pkgs_groups=$(pl_parsePkgs group $fcdistro $pldistro $pkgsfile)
+ # packages to exclude - obsolete, was maybe useful when installing a group
+ pkgs_excludes=$(pl_parsePkgs exclude $fcdistro $pldistro $pkgsfile)
+ pkgs_junk=$(pl_parsePkgs junk $fcdistro $pldistro $pkgsfile)
+ pkgs_precious=$(pl_parsePkgs precious $fcdistro $pldistro $pkgsfile)
+ # formerly related to mkfedora -k
+ pkgs_kexcludes=$(pl_parsePkgs kexclude $fcdistro $pldistro $pkgsfile)
+ # get mirrors if not specified with -l
+ if [ -z "$mirrors" ] ; then
+ mirrorsfile=$(pl_locateDistroFile ../build/ $pldistro "$pldistro.mirrors")
+ mirrors=$(pl_parsePkgs mirror $fcdistro $pldistro $mirrorsfile)
+ fi
+
+ exclude_kernel=""
+ # add them manually as the output of pl_parsePkgs is line-separated
+ if [ -n "$pkgs_kexcludes" ] ; then
+ exclude_kernel="exclude="
+ for kexclude in $pkgs_kexcludes ; do
+ exclude_kernel="$exclude_kernel $kexclude"
+ done
+ fi
+
+ function mkfedora_fetch ()
+ {
+ curl --fail --silent --max-time 60 "$1"
+ }
+
+ # set list of attempted locations according to target distro
+ # xxx all this should go into mirroring/ somehow
+ case $pl_DISTRO in
+ Fedora)
+ if [ $releasever -ge 7 ] ; then
+ # Plain Fedora comes with a new layout
+ attempts="
+fedora/releases/$releasever/Everything/$basearch/os
+linux/releases/$releasever/Everything/$basearch/os
+$releasever/Everything/$basearch/os
+core/$releasever/Everything/$basearch/os
+linux/core/$releasever/$basearch/os
+"
+ else
+ # Fedora Core
+ attempts="
+fedora/core/$releasever/$basearch/os
+linux/core/$releasever/$basearch/os
+core/$releasever/$basearch/os
+$releasever/$basearch/os
+"
+ fi
+ public_gpg_key=RPM-GPG-KEY-fedora
+ ;;
+ CentOS)
+ # xxx hacky for now
+ # you can use vbuild-fedora-mirror with -f centos5.1
+ # which is hard-coded in mirroring/centos as well
+ # for now I do the mapping here, mmhh
+ case $releasever in
+ 4) actual=4.6 ;;
+ 5) actual=5.1 ;;
+ *) actual=$releasever ;;
+ esac
+ attempts="
+centos/$actual/os/$basearch
+"
+ public_gpg_key=RPM-GPG-KEY-CentOS-$releasever
+ ;;
+ *)
+ echo "distro $pl_DISTRO not supported in build.common / mkfedora" ; exit 1
+ esac
+
+ echo "$0: candidate mirrors"
+ for mirror in $mirrors ; do
+ echo "* candidate mirror $mirror"
+ done
+ baseurl=""
+ for mirror in $mirrors ; do
+ for attempt in $attempts; do
+ attempturl=$mirror/$attempt
+ if mkfedora_fetch $attempturl/repodata/repomd.xml >/dev/null ; then
+ baseurl=$attempturl
+ break 2
+ fi
+ done
+ done
+
+ if [ -z "$baseurl" ] ; then
+ echo "Error: $releasever/$basearch/os/repodata/repomd.xml"
+ echo " could not be found in any of the following locations:"
+ echo
+ for mirror in $mirrors ; do
+ for attempt in $attempts ; do
+ echo $mirror/$attempt
+ done
+ done
+ echo
+ mkfedora_usage
+ else
+ echo "* selecting mirror with baseurl=$baseurl"
+ fi
+
+ # Do not tolerate errors
+ set -e
+
+ ## make rpms ignore installing stuff to special fs entries like /proc
+ # Because of https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=52725
+ # you have to use at least one language beside 'C'
+ # Prevent all locales from being installed in reference image
+ mkdir -p $vroot/etc/rpm
+ pl_root_rpm_macros > $vroot/etc/rpm/macros
+
+ # Trick rpm and yum, who read the real root /etc/rpm/macros file
+ # rather than the one installed in the reference image, despite what
+ # you might expect the --root and --installroot options to mean. Both
+ # programs always read $HOME/.rpmmacros.
+ export HOME=$vroot/tmp
+ mkdir -p $vroot/tmp
+ pl_root_rpm_macros > $vroot/tmp/.rpmmacros
+
+ function mkfedora_cleanup () {
+ umount -l $vroot/proc
+ umount -l $vroot/dev/shm
+ umount -l $vroot/dev/pts
+ }
+
+ # Clean up before exiting if anything goes wrong
+ trap "mkfedora_cleanup" ERR INT
+
+ # Mount in reference image
+ mount -t devpts none $vroot/dev/pts
+ mount -t tmpfs none $vroot/dev/shm
+ mkdir -p $vroot/proc
+ mount -t proc none $vroot/proc
+
+ # Create a /var/lib dirs for yum & rpm
+ mkdir -p $vroot/var/lib/yum
+ mkdir -p $vroot/var/lib/rpm
+ mkdir -p $vroot/usr/share/info
+
+ # Create a dummy /etc/fstab in reference image
+ mkdir -p $vroot/etc
+ cat >$vroot/etc/fstab <<EOF
+# This fake fstab exists only to please df and linuxconf.
+/dev/hdv1 / ext2 defaults 1 1
+EOF
+ cp $vroot/etc/fstab $vroot/etc/mtab
+
+ # Necessary for some scripts
+ mkdir -p $vroot/etc/sysconfig
+ echo "NETWORKING=yes" > $vroot/etc/sysconfig/network
+
+ # Initialize RPM database in reference image
+ mkdir -p $vroot/var/lib/rpm
+ rpm --root $vroot --initdb
+ rpm --root $vroot --import $baseurl/$public_gpg_key
+
+ # Initialize yum in reference image
+ mkdir -p $vroot/var/cache/yum $vroot/var/log
+ if [ $releasever -lt 7 ] ; then
+ corename="Core "
+ else
+ corename=""
+ fi