X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=build.common;h=11ea761ae9f4d6361304ee7feb76900f07cbd683;hb=a1a16b82b37dcf84f05f0afd7c3d472d5a28ca46;hp=22bb8c04f20de42c271453b739cdf0c2b157e3df;hpb=d57111569ce3a895c3d9f5321835f837d1c0278c;p=build.git diff --git a/build.common b/build.common index 22bb8c04..11ea761a 100644 --- a/build.common +++ b/build.common @@ -9,53 +9,38 @@ # $Id$ # -function pl_getDefaultDistro() { - # FC4 is currently the default release - echo "Fedora" - return 0 -} - -function pl_getDefaultRelease() { - # FC4 is currently the default release - echo "4" - return 0 -} +# support for fedora and centos only for now function pl_getDistro() { - defaultDistro=$(pl_getDefaultDistro) if [ -f "/etc/redhat-release" ] ; then distro=$(awk ' { print $1 } ' /etc/redhat-release) else - distro=$defaultDistro + echo "build.common.pl_getDistro-unknown" + exit 1 fi echo "$distro" return 0 } function pl_getRelease() { - defaultRelease=$(pl_getDefaultRelease) if [ -f "/etc/redhat-release" ] ; then release=$(awk ' { if ($1=="Fedora" && $2=="Core") print $4 ; if (($1=="Fedora" && $2!="Core")||$1=="CentOS") print $3 } ' /etc/redhat-release) - [ $release -lt $defaultRelease ] && release=$defaultRelease else - release=$defaultRelease + echo "build.common.pl_getRelease-unknown" + exit 1 fi echo "$release" return 0 } -# vserver expects something like fc4 or f7 -# for fedora and centos only for now +# vserver expects something like f8 or centos5 function pl_getReleaseName () { distro=$1; shift release=$1; shift case $distro in [Ff]edora*) - if [ "$release" -le 6 ] ; then - releasename=fc$release - else - releasename=f$release - fi ;; + releasename=f$release + ;; [Cc]entOS*) old_IFS="$IFS" IFS="." @@ -73,6 +58,23 @@ function pl_getReleaseName () { return 0 } +# on fedora 8 or 9, we use libnl from the stock repos +# on centos5 we build it locally +function pl_getKexcludes () { + distroname=$1; shift + case $distroname in + f8|f9) + echo 'kernel* util-vserver* iptables iproute' + ;; + centos5) + echo 'kernel* util-vserver* iptables iproute inotify-tools* libnl*' + ;; + *) + echo "pl_DISTRO_NAME=$pl_DISTRO_NAME not supported in getexcludes.sh" + ;; + esac +} + # figure out which redhat distro we are using (fedora, centos, redhat) pl_DISTRO=$(pl_getDistro) @@ -82,12 +84,15 @@ pl_DISTRO_ARCH=$(uname -i 2>/dev/null|| echo unknownarch) # the release number (plain number) pl_DISTRO_RELEASE=$(pl_getRelease) -# the release name - for vserver build - like fc4, f8 or centos4 +# the release name - for vserver build ... pl_DISTRO_NAME=$(pl_getReleaseName $pl_DISTRO $pl_DISTRO_RELEASE) +# the packages to exclude +pl_KEXCLUDES=$(pl_getKexcludes $pl_DISTRO_NAME) + # get path to appropriate yumgroups.xml file # Thierry: quick & dirty improvement -# this file is updated by the toplevel build, from groups/.xml +# this file is updated by the toplevel build, from the .pkgs files pl_DISTRO_YUMGROUPS="../../../RPMS/yumgroups.xml" function pl_process_fedora_options () { @@ -198,25 +203,10 @@ function pl_root_mkfedora () { basearch=$pl_DISTRO_ARCH # Get options - mirrors="" - while getopts "l:r:a:vh" opt ; do + while getopts "vh" opt ; do case $opt in - l) - mirrors="$mirrors $OPTARG" - ;; - r) - releasever=$OPTARG - ;; - a) - basearch=$OPTARG - ;; - v) - verbose=1 - set -x - ;; - h|*) - mkfedora_usage - ;; + v) verbose=1; set -x ;; + h|*) mkfedora_usage ;; esac done @@ -233,120 +223,42 @@ function pl_root_mkfedora () { 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 + # packages to exclude pkgs_excludes=$(pl_parsePkgs exclude $fcdistro $pldistro $pkgsfile) + # what can get trashed to save space pkgs_junk=$(pl_parsePkgs junk $fcdistro $pldistro $pkgsfile) + # but not this pkgs_precious=$(pl_parsePkgs precious $fcdistro $pldistro $pkgsfile) - # formerly related to mkfedora -k - pkgs_kexcludes=$(pl_parsePkgs kexclude $fcdistro $pldistro $pkgsfile) + # formerly related to mkfedora -k : packages to take from our own build + # and thus need be excluded frem the stock repos + pkgs_kexcludes=$(pl_parsePkgs kexclude $fcdistro $pldistro $pkgsfile | sed -e s,@KEXCLUDE@,"$pl_KEXCLUDES",) # 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="" + kexclude_line="" # add them manually as the output of pl_parsePkgs is line-separated if [ -n "$pkgs_kexcludes" ] ; then - exclude_kernel="exclude=" + kexclude_line="exclude=" for kexclude in $pkgs_kexcludes ; do - exclude_kernel="$exclude_kernel $kexclude" + kexclude_line="$kexclude_line $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 - public_gpg_key=RPM-GPG-KEY-fedora - # Plain Fedora comes with a new layout - attempts_base=" -fedora/releases/$releasever/Everything/$basearch/os -linux/releases/$releasever/Everything/$basearch/os -" - optionals="updates" - attempts_optional=" -fedora/@optional@/$releasever/$basearch -" - else - # Fedora Core - public_gpg_key=RPM-GPG-KEY-fedora - attempts_base=" -fedora/core/$releasever/$basearch/os -linux/core/$releasever/$basearch/os -core/$releasever/$basearch/os -$releasever/$basearch/os -" - optionals="updates extras" - attempts_optional=" -linux/core/@optional@/$releasever/$basearch \ -core/@optional@/$releasever/$basearch \ -linux/@optional@/$releasever/$basearch \ -@optional@/$releasever/$basearch \ -" - fi - ;; - CentOS) - # xxx hacky for now - # you can use vbuild-fedora-mirror with -f centos5.2 - # which is hard-coded in mirroring/centos as well - # for now I do the mapping here, mmhh - public_gpg_key=RPM-GPG-KEY-CentOS-$releasever - case $releasever in - 4) actual=4.6 ;; - 5) actual=5.2 ;; - *) actual=$releasever ;; - esac - attempts_base=" -centos/$actual/os/$basearch -" - optionals="updates extras" - attempts_optional=" -linux/core/@optional@/$releasever/$basearch \ -core/@optional@/$releasever/$basearch \ -linux/@optional@/$releasever/$basearch \ -@optional@/$releasever/$basearch \ -" - ;; - *) - 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_base; 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_base ; do - echo $mirror/$attempt - done - done - echo - mkfedora_usage - else - echo "* selecting mirror with baseurl=$baseurl" + # the repo part of the final yum.conf + yum_conf_repos=$vroot/xxxmkfedora-repos.confxxx + if ! yumconf_mirrors $yum_conf_repos ../build/ $fcdistro "$kexclude_line" $mirrors ; then + echo xxx -- error ; return 1 fi + + public_gpg_key=$(yumconf_gpgkey $yum_conf_repos) # Do not tolerate errors set -e @@ -401,15 +313,10 @@ EOF # Initialize RPM database in reference image mkdir -p $vroot/var/lib/rpm rpm --root $vroot --initdb - rpm --root $vroot --import $baseurl/$public_gpg_key + rpm --root $vroot --import $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 # yum.conf is for building only - store in different location than /etc/yum.conf yum_conf=$vroot/etc/mkfedora-yum.conf @@ -428,38 +335,9 @@ gpgcheck=0 # Prevent yum-2.4 from loading additional repository definitions # (e.g., from /etc/yum.repos.d/) reposdir=/dev/null - -[base] -name=Fedora ${corename}${releasever} - $basearch - base -baseurl=$baseurl/ -$exclude_kernel -EOF - - for optional in $optionals ; do - found="" - # locating updates/extras - attempts=$(echo $attempts_optional | sed -e s,@optional@,$optional,g) - for attempt in $attemps; do - optionalurl=$mirror/$attempt - echo "* $optional : Trying to fetch $optionalurl" - if mkfedora_fetch $optionalurl/repodata/repomd.xml ; then - echo "* FOUND!" - cat >> $yum_conf <> $yum_conf # If we are being built as part of an automated RPM build, solve the # bootstrap problem by including any just built packages in the yum @@ -473,8 +351,8 @@ EOF fi cat >> $yum_conf </, then in build/planetlab/ @@ -756,3 +642,90 @@ cat <<__footer __footer } + + +function build_fetch () { + curl --fail --silent --max-time 60 --output /dev/null "$1" +} + +# tries to compute a valid yum.conf for that pldistro from the template in mirroring/ +# returns 0 and writes on success +# returns 1 on failure, in which case is deleted +function yumconf_mirrors () { + dest_yumconf=$1; shift + builddir=$1; shift + fcdistro=$1; shift + kexclude_line="$1" ; shift + mirrors="$@" + + template=$builddir/mirroring/$fcdistro/yum.repos.d/building.repo.in + + if [ ! -f $template ] ; then + echo "yumconf_mirrors: cannot locate template $template" + rm -f $dest_yumconf + return 1 + fi + + for mirror in $mirrors; do + if yumconf_mirror $dest_yumconf $template "$kexclude_line" $mirror; then + return 0 + fi + done + rm -f $dest_yumconf + return 1 +} + +# computes a yum.conf from the template, and checks that all baseurl defined in there are valid repos +# returns 0 on success and 1 on failure +function yumconf_mirror () { + dest_yumconf=$1; shift + template=$1; shift + kexclude_line="$1" ; shift + mirror=$1; shift + + sed -e "s,@MIRRORURL@,$mirror,g" \ + -e "/baseurl=/i\\ +$kexclude_line" $template > $dest_yumconf + + # capture all lines defining baseurl + baseurl_defs=$(grep '^baseurl=' $dest_yumconf) + if [ -z "$baseurl_defs" ] ; then + return 1 + fi + + for baseurl_def in $baseurl_defs; do + baseurl=$(echo $baseurl_def | sed \ + -e s,baseurl=,, \ + -e 's,$basearch,'"$pl_DISTRO_ARCH",g) + repomd=$baseurl/repodata/repomd.xml + + echo "* Trying to fetch $repomd" + if ! build_fetch $repomd ; then + echo "* Failed to fetch $repomd" + return 1 + fi + done + echo "* Selected mirror $mirror" + return 0 +} + +# from a yum.conf as generated above, computes the (first) gpgkey url +function yumconf_gpgkey () { + dest_yumconf=$1; shift + + first_line=$(grep '^gpgkey=' $dest_yumconf | head -1) + values=$(echo $first_line | sed -e s,gpgkey=,,) + value=$(echo $values | awk '{print $1;}' | sed -e 's,$basearch,'"$pl_DISTRO_ARCH",g) + [ -n "$value" ] || return 1 + echo $value + return 0 +} + +# patches a yum conf to insert an exclude line in each declared repo +function yumconf_exclude () { + repo=$1; shift + kexclude_line="$1" ; shift + + sed -i -e "/baseurl=.*$/i\\ +$kexclude_line" $repo +}