X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=build.common;h=153a010d0fcba8402f94b9e9d9b665d2ea59bc53;hb=d1f94c44a0144b96767a58812240297ac2798a27;hp=22bb8c04f20de42c271453b739cdf0c2b157e3df;hpb=d57111569ce3a895c3d9f5321835f837d1c0278c;p=build.git diff --git a/build.common b/build.common index 22bb8c04..153a010d 100644 --- a/build.common +++ b/build.common @@ -9,43 +9,31 @@ # $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 function pl_getReleaseName () { distro=$1; shift release=$1; shift @@ -198,25 +186,15 @@ function pl_root_mkfedora () { basearch=$pl_DISTRO_ARCH # Get options - mirrors="" - while getopts "l:r:a:vh" opt ; do +### 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 - ;; +### l) mirrors="$mirrors $OPTARG" ;; +### r) releasever=$OPTARG ;; +### a) basearch=$OPTARG ;; + v) verbose=1; set -x ;; + h|*) mkfedora_usage ;; esac done @@ -245,108 +223,27 @@ function pl_root_mkfedora () { mirrors=$(pl_parsePkgs mirror $fcdistro $pldistro $mirrorsfile) fi - exclude_kernel="" + exclude_line="" # add them manually as the output of pl_parsePkgs is line-separated if [ -n "$pkgs_kexcludes" ] ; then - exclude_kernel="exclude=" + exclude_line="exclude=" for kexclude in $pkgs_kexcludes ; do - exclude_kernel="$exclude_kernel $kexclude" + exclude_line="$exclude_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 "$exclude_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 +298,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 +320,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 +336,8 @@ EOF fi cat >> $yum_conf </, then in build/planetlab/ @@ -756,3 +627,81 @@ 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 + exclude_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 "$exclude_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 + exclude_line="$1" ; shift + mirror=$1; shift + + sed -e "s,@MIRRORURL@,$mirror,g" \ + -e "/baseurl=/i\\ +$exclude_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 +}