Blame src/rpms.sh

Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
#
Packit bbb0ff
#   Name: rpms.sh - part of the BeakerLib project
Packit bbb0ff
#   Description: Package manipulation helpers
Packit bbb0ff
#
Packit bbb0ff
#   Author: Petr Muller <pmuller@redhat.com>
Packit bbb0ff
#   Author: Jan Hutar <jhutar@redhat.com>
Packit bbb0ff
#   Author: Petr Splichal <psplicha@redhat.com>
Packit bbb0ff
#   Author: Ales Zelinka <azelinka@redhat.com>
Packit bbb0ff
#
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
#
Packit bbb0ff
#   Copyright (c) 2008-2010 Red Hat, Inc. All rights reserved.
Packit bbb0ff
#
Packit bbb0ff
#   This copyrighted material is made available to anyone wishing
Packit bbb0ff
#   to use, modify, copy, or redistribute it subject to the terms
Packit bbb0ff
#   and conditions of the GNU General Public License version 2.
Packit bbb0ff
#
Packit bbb0ff
#   This program is distributed in the hope that it will be
Packit bbb0ff
#   useful, but WITHOUT ANY WARRANTY; without even the implied
Packit bbb0ff
#   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit bbb0ff
#   PURPOSE. See the GNU General Public License for more details.
Packit bbb0ff
#
Packit bbb0ff
#   You should have received a copy of the GNU General Public
Packit bbb0ff
#   License along with this program; if not, write to the Free
Packit bbb0ff
#   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit bbb0ff
#   Boston, MA 02110-1301, USA.
Packit bbb0ff
#
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head1 NAME
Packit bbb0ff
Packit bbb0ff
BeakerLib - rpms - Package manipulation helpers
Packit bbb0ff
Packit bbb0ff
=head1 DESCRIPTION
Packit bbb0ff
Packit bbb0ff
Functions in this BeakerLib script are used for RPM manipulation.
Packit bbb0ff
Packit bbb0ff
=head1 FUNCTIONS
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
. $BEAKERLIB/testing.sh
Packit bbb0ff
. $BEAKERLIB/infrastructure.sh
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# Internal Stuff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
Packit bbb0ff
__INTERNAL_RpmPresent() {
Packit bbb0ff
    local assert=$1
Packit bbb0ff
    local name=$2
Packit bbb0ff
    local version=$3
Packit bbb0ff
    local release=$4
Packit bbb0ff
    local arch=$5
Packit bbb0ff
Packit bbb0ff
    local package=$name-$version-$release.$arch
Packit bbb0ff
    [ "$arch"    == "" ] && package=$name-$version-$release
Packit bbb0ff
    [ "$release" == "" ] && package=$name-$version
Packit bbb0ff
    [ "$version" == "" ] && package=$name
Packit bbb0ff
Packit bbb0ff
    export __INTERNAL_RPM_ASSERTED_PACKAGES="$__INTERNAL_RPM_ASSERTED_PACKAGES $name"
Packit bbb0ff
    rljRpmLog "$name"
Packit bbb0ff
Packit bbb0ff
    if [ -n "$package" ]; then
Packit bbb0ff
        rpm -q $package
Packit bbb0ff
        local status=$?
Packit bbb0ff
    else
Packit bbb0ff
        local status=100
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    if [ "$assert" == "assert" ] ; then
Packit bbb0ff
        __INTERNAL_ConditionalAssert "Checking for the presence of $package rpm" $status
Packit bbb0ff
    elif [ "$assert" == "assert_inverted" ] ; then
Packit bbb0ff
        if [ $status -eq 1 ]; then
Packit bbb0ff
            status=0
Packit bbb0ff
        elif [ $status -eq 0 ]; then
Packit bbb0ff
            status=1
Packit bbb0ff
        fi
Packit bbb0ff
        __INTERNAL_ConditionalAssert "Checking for the non-presence of $package rpm" $status
Packit bbb0ff
    elif [ $status -eq 0 ] ; then
Packit bbb0ff
        rlLog "Package $package is present"
Packit bbb0ff
    else
Packit bbb0ff
        rlLog "Package $package is not present"
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    if rpm -q --quiet $package
Packit bbb0ff
    then
Packit bbb0ff
      rlLog "Package versions:"
Packit bbb0ff
      rpm -q --qf '%{name}-%{version}-%{release}.%{arch}\n' $package | while read line
Packit bbb0ff
      do
Packit bbb0ff
        rlLog "  $line"
Packit bbb0ff
      done
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    return $status
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlCheckRpm
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head2 Rpm Handling
Packit bbb0ff
Packit bbb0ff
=head3 rlCheckRpm
Packit bbb0ff
Packit bbb0ff
Check whether a package is installed.
Packit bbb0ff
Packit bbb0ff
    rlCheckRpm name [version] [release] [arch]
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item name
Packit bbb0ff
Packit bbb0ff
Package name like C<kernel>
Packit bbb0ff
Packit bbb0ff
=item version
Packit bbb0ff
Packit bbb0ff
Package version like C<2.6.25.6>
Packit bbb0ff
Packit bbb0ff
=item release
Packit bbb0ff
Packit bbb0ff
Package release like C<55.fc9>
Packit bbb0ff
Packit bbb0ff
=item arch
Packit bbb0ff
Packit bbb0ff
Package architucture like C<i386>
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
Returns 0 if the specified package is installed.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
rlCheckRpm() {
Packit bbb0ff
    __INTERNAL_RpmPresent noassert $1 $2 $3 $4
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# backward compatibility
Packit bbb0ff
rlRpmPresent() {
Packit bbb0ff
    rlLogWarning "rlRpmPresent is obsoleted by rlCheckRpm"
Packit bbb0ff
    __INTERNAL_RpmPresent noassert $1 $2 $3 $4
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlAssertRpm
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlAssertRpm
Packit bbb0ff
Packit bbb0ff
Assertion making sure that a package is installed.
Packit bbb0ff
Packit bbb0ff
    rlAssertRpm name [version] [release] [arch]>
Packit bbb0ff
    rlAssertRpm --all
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item name
Packit bbb0ff
Packit bbb0ff
Package name like C<kernel>
Packit bbb0ff
Packit bbb0ff
=item version
Packit bbb0ff
Packit bbb0ff
Package version like C<2.6.25.6>
Packit bbb0ff
Packit bbb0ff
=item release
Packit bbb0ff
Packit bbb0ff
Package release like C<55.fc9>
Packit bbb0ff
Packit bbb0ff
=item arch
Packit bbb0ff
Packit bbb0ff
Package architucture like C<i386>
Packit bbb0ff
Packit bbb0ff
=item --all
Packit bbb0ff
Packit bbb0ff
Assert all packages listed in the $PACKAGES $REQUIRES and $COLLECTIONS
Packit bbb0ff
environment variables.
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
Returns 0 and asserts PASS if the specified package is installed.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
rlAssertRpm() {
Packit bbb0ff
    local package packages
Packit bbb0ff
    if [ "$1" = "--all" ] ; then
Packit bbb0ff
        packages="$PACKAGES $REQUIRES $COLLECTIONS"
Packit bbb0ff
        if [ "$packages" = "  " ] ; then
Packit bbb0ff
            __INTERNAL_ConditionalAssert "rlAssertRpm: No package provided" 1
Packit bbb0ff
            return
Packit bbb0ff
        fi
Packit bbb0ff
        for package in $packages ; do
Packit bbb0ff
            rlAssertRpm $package
Packit bbb0ff
        done
Packit bbb0ff
    else
Packit bbb0ff
        __INTERNAL_RpmPresent assert $1 $2 $3 $4
Packit bbb0ff
    fi
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlAssertNotRpm
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlAssertNotRpm
Packit bbb0ff
Packit bbb0ff
Assertion making sure that a package is not installed. This is
Packit bbb0ff
just inverse of C<rlAssertRpm>.
Packit bbb0ff
Packit bbb0ff
    rlAssertNotRpm name [version] [release] [arch]>
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item name
Packit bbb0ff
Packit bbb0ff
Package name like C<kernel>
Packit bbb0ff
Packit bbb0ff
=item version
Packit bbb0ff
Packit bbb0ff
Package version like C<2.6.25.6>
Packit bbb0ff
Packit bbb0ff
=item release
Packit bbb0ff
Packit bbb0ff
Package release like C<55.fc9>
Packit bbb0ff
Packit bbb0ff
=item arch
Packit bbb0ff
Packit bbb0ff
Package architucture like C<i386>
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
Returns 0 and asserts PASS if the specified package is not installed.
Packit bbb0ff
Packit bbb0ff
=head3 Example
Packit bbb0ff
Packit bbb0ff
Function C<rlAssertRpm> is useful especially in prepare phase
Packit bbb0ff
where it causes abort if a package is missing, while
Packit bbb0ff
C<rlCheckRpm> is handy when doing something like:
Packit bbb0ff
Packit bbb0ff
    if ! rlCheckRpm package; then
Packit bbb0ff
         yum install package
Packit bbb0ff
         rlAssertRpm package
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
rlAssertNotRpm() {
Packit bbb0ff
    __INTERNAL_RpmPresent assert_inverted $1 $2 $3 $4
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlAssertBinaryOrigin
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlAssertBinaryOrigin
Packit bbb0ff
Packit bbb0ff
Assertion making sure that given binary is owned by (one of) the given
Packit bbb0ff
package(s).
Packit bbb0ff
Packit bbb0ff
    rlAssertBinaryOrigin binary package [package2 [...]]
Packit bbb0ff
    PACKAGES=... rlAssertBinaryOrigin binary
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item binary
Packit bbb0ff
Packit bbb0ff
Binary name like C<ksh> or C</bin/ksh>
Packit bbb0ff
Packit bbb0ff
=item package
Packit bbb0ff
Packit bbb0ff
List of packages like C<ksh mksh>. The parameter is optional. If missing,
Packit bbb0ff
contents of environment variable $PACKAGES are taken into account.
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
Returns 0 and asserts PASS if the specified binary belongs to (one of) the given package(s).
Packit bbb0ff
Returns 1 and asserts FAIL if the specified binary does not belong to (any of) the given package(s).
Packit bbb0ff
Returns 2 and asserts FAIL if the specified binary is not found.
Packit bbb0ff
Returns 3 and asserts FAIL if no packages are given.
Packit bbb0ff
Returns 100 and asserts FAIL if invoked with no parameters.
Packit bbb0ff
Packit bbb0ff
=head3 Example
Packit bbb0ff
Packit bbb0ff
Function C<rlAssertBinaryOrigin> is useful especially in prepare phase
Packit bbb0ff
where it causes abort if a binary is missing or is owned by different package:
Packit bbb0ff
Packit bbb0ff
    PACKAGES=mksh rlAssertBinaryOrigin ksh
Packit bbb0ff
    or
Packit bbb0ff
    rlAssertBinaryOrigin ksh mksh
Packit bbb0ff
Packit bbb0ff
Returns true if ksh is owned by the mksh package (in this case: /bin/ksh is a
Packit bbb0ff
symlink pointing to /bin/mksh).
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
rlAssertBinaryOrigin() {
Packit bbb0ff
    # without parameters, exit immediatelly
Packit bbb0ff
    local status CMD FULL_CMD
Packit bbb0ff
    status=0
Packit bbb0ff
    [ $# -eq 0 ] && {
Packit bbb0ff
       status=100
Packit bbb0ff
       rlLogError "rlAssertBinaryOrigin called without parameters"
Packit bbb0ff
       __INTERNAL_ConditionalAssert "rlAssertBinaryOrigin: No binary given" $status
Packit bbb0ff
       return $status
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    CMD=$1
Packit bbb0ff
    shift
Packit bbb0ff
Packit bbb0ff
    # if not given explicitly as param, take PKGS from $PACKAGES
Packit bbb0ff
    local PKGS=$@
Packit bbb0ff
    [ $# -eq 0 ] && PKGS=$PACKAGES
Packit bbb0ff
    if [ -z "$PKGS" ]; then
Packit bbb0ff
        status=3
Packit bbb0ff
       __INTERNAL_ConditionalAssert "rlAssertBinaryOrigin: No packages given" $status
Packit bbb0ff
       return $status
Packit bbb0ff
   fi
Packit bbb0ff
Packit bbb0ff
    status=2
Packit bbb0ff
    FULL_CMD=$(which $CMD) &>/dev/null && \
Packit bbb0ff
    {
Packit bbb0ff
        status=1
Packit bbb0ff
        # expand symlinks (if any)
Packit bbb0ff
        local BINARY=$(readlink -f $FULL_CMD)
Packit bbb0ff
Packit bbb0ff
        # get the rpm owning the binary
Packit bbb0ff
        local BINARY_RPM=$(rpm -qf --qf="%{name}\n" $BINARY | uniq)
Packit bbb0ff
Packit bbb0ff
        rlLogDebug "Binary rpm: $BINARY_RPM"
Packit bbb0ff
Packit bbb0ff
        local TESTED_RPM
Packit bbb0ff
        for TESTED_RPM in $PKGS ; do
Packit bbb0ff
            if [ "$TESTED_RPM" = "$BINARY_RPM" ] ; then
Packit bbb0ff
                status=0
Packit bbb0ff
                echo $BINARY_RPM
Packit bbb0ff
                break
Packit bbb0ff
            fi
Packit bbb0ff
        done
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    [ $status -eq 2 ] && rlLogError "$CMD: command not found"
Packit bbb0ff
    [ $status -eq 1 ] && rlLogError "$BINARY belongs to $BINARY_RPM"
Packit bbb0ff
Packit bbb0ff
    __INTERNAL_ConditionalAssert "Binary '$CMD' should belong to: $PKGS" $status
Packit bbb0ff
    return $status
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlGetMakefileRequires
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlGetMakefileRequires
Packit bbb0ff
Packit bbb0ff
Prints comma separated list of requirements defined in Makefile using 'Requires'
Packit bbb0ff
attribute.
Packit bbb0ff
Packit bbb0ff
Return 0 if success.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
rlGetMakefileRequires() {
Packit bbb0ff
  [[ -s ./Makefile ]] || {
Packit bbb0ff
    rlLogError "Could not find ./Makefile or the file is empty"
Packit bbb0ff
    return 1
Packit bbb0ff
  }
Packit bbb0ff
  grep '"Requires:' Makefile | sed -e 's/.*Requires: *\(.*\)".*/\1/' | tr ' ' '\n' | sort | uniq | tr '\n' ' ' | sed -r 's/^ +//;s/ +$//;s/ +/ /g'
Packit bbb0ff
  return 0
Packit bbb0ff
}; # end of rlGetMakefileRequires
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlCheckRequirements
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlCheckRequirements
Packit bbb0ff
Packit bbb0ff
Check that all given requirements are covered eigther by installed package or by
Packit bbb0ff
binary available in PATHs or by some package's provides.
Packit bbb0ff
Packit bbb0ff
    rlRun "rlCheckRequirements REQ..."
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item REQ
Packit bbb0ff
Packit bbb0ff
Requirement to be checked. It can be package name, provides string or binary
Packit bbb0ff
name.
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
Returns number of unsatisfied requirements.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
#'
Packit bbb0ff
Packit bbb0ff
rlCheckRequirements() {
Packit bbb0ff
  local req res=0 package binary provides LOG=() LOG2 l=0 ll
Packit bbb0ff
  for req in "$@"; do
Packit bbb0ff
    package="$(rpm -q "$req" 2> /dev/null)"
Packit bbb0ff
    if [[ $? -eq 0 ]]; then
Packit bbb0ff
      LOG=("${LOG[@]}" "$package" "covers requirement '$req'")
Packit bbb0ff
      rljRpmLog "$package"
Packit bbb0ff
    else
Packit bbb0ff
      binary="$(which "$req" 2> /dev/null)"
Packit bbb0ff
      if [[ $? -eq 0 ]]; then
Packit bbb0ff
        package="$(rpm -qf "$binary")"
Packit bbb0ff
        LOG=("${LOG[@]}" "$package" "covers requirement '$req' by binary '$binary' from package '$package'")
Packit bbb0ff
        rljRpmLog "$package"
Packit bbb0ff
      else
Packit bbb0ff
        package="$(rpm -q --whatprovides "$req" 2> /dev/null)"
Packit bbb0ff
        if [[ $? -eq 0 ]]; then
Packit bbb0ff
          LOG=("${LOG[@]}" "$package" "covers requirement '$req'")
Packit bbb0ff
          rljRpmLog "$package"
Packit bbb0ff
        else
Packit bbb0ff
          rlLogWarning "requirement '$req' not satisfied"
Packit bbb0ff
          let res++
Packit bbb0ff
        fi
Packit bbb0ff
      fi
Packit bbb0ff
    fi
Packit bbb0ff
  done
Packit bbb0ff
  LOG2=("${LOG[@]}")
Packit bbb0ff
  while [[ ${#LOG2[@]} -gt 0 ]]; do
Packit bbb0ff
    [[ ${#LOG2} -gt $l ]] && l=${#LOG2}
Packit bbb0ff
    LOG2=("${LOG2[@]:2}")
Packit bbb0ff
  done
Packit bbb0ff
  local spaces=''
Packit bbb0ff
  for ll in `seq $l`; do spaces="$spaces "; done
Packit bbb0ff
  while [[ ${#LOG[@]} -gt 0 ]]; do
Packit bbb0ff
    let ll=$l-${#LOG}+1
Packit bbb0ff
    rlLog "package '$LOG' ${spaces:0:$ll} ${LOG[1]}"
Packit bbb0ff
    LOG=("${LOG[@]:2}")
Packit bbb0ff
  done
Packit bbb0ff
  return $res
Packit bbb0ff
}; # end of rlCheckRequirements
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlCheckMakefileRequires
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlCheckMakefileRequires
Packit bbb0ff
Packit bbb0ff
This is just a bit smarted wrapper of
Packit bbb0ff
Packit bbb0ff
C<rlCheckRequirements $(rlGetMakefileRequires)>
Packit bbb0ff
Packit bbb0ff
=head3 Example
Packit bbb0ff
Packit bbb0ff
    rlRun "rlCheckMakefileRequires"
Packit bbb0ff
Packit bbb0ff
Return 255 if requirements could not be retrieved, 0 if all requirements are
Packit bbb0ff
satisfied or number of unsatisfied requirements.
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
rlCheckMakefileRequires() {
Packit bbb0ff
  local req
Packit bbb0ff
  req="$(rlGetMakefileRequires)" || return 255
Packit bbb0ff
  eval rlCheckRequirements $req
Packit bbb0ff
}; # end of rlCheckMakefileRequires
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlAssertRequired
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<=cut
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlAssertRequired
Packit bbb0ff
Packit bbb0ff
Ensures that all Requires, specified in beakerlib-style beaker-wizard layout
Packit bbb0ff
Makefile, are installed.
Packit bbb0ff
Packit bbb0ff
    rlAssertRequired
Packit bbb0ff
Packit bbb0ff
Prints out a verbose list of installed/missing packages during operation.
Packit bbb0ff
Packit bbb0ff
Returns 0 if all required packages are installed, 1 if one
Packit bbb0ff
or more packages are missing or if no Makefile is present.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
rlAssertRequired(){
Packit bbb0ff
    local MAKEFILE="Makefile"
Packit bbb0ff
Packit bbb0ff
    if [ ! -e "$MAKEFILE" ]; then
Packit bbb0ff
        rlLogError "rlAssertRequired: $MAKEFILE not present"
Packit bbb0ff
        return 1
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    list="$(grep 'Requires:' $MAKEFILE)"
Packit bbb0ff
    if [ -z "$list" ]; then
Packit bbb0ff
        rlLogError "rlAssertRequired: $MAKEFILE does not contain 'Requires:'"
Packit bbb0ff
        return 1
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    list=$(echo "$list" | sed -r 's/^[ \t]+@echo "Requires:[ \t]+([^"]+)" >> \$\(METADATA\)$/\1/' | tr '\n' ' ')
Packit bbb0ff
Packit bbb0ff
    rpm -q $list
Packit bbb0ff
Packit bbb0ff
    __INTERNAL_ConditionalAssert "Assert required packages installed" $?
Packit bbb0ff
Packit bbb0ff
    return $?
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
: <<=cut
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head2 Getting RPMs
Packit bbb0ff
Packit bbb0ff
=head3 Download methods
Packit bbb0ff
Packit bbb0ff
Functions handling rpm downloading/installing can use more methods for actual
Packit bbb0ff
download of the rpm.
Packit bbb0ff
Packit bbb0ff
Currently there are two download methonds available:
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item direct
Packit bbb0ff
Packit bbb0ff
Use use dirct download from build system (brew).
Packit bbb0ff
Packit bbb0ff
=item yum
Packit bbb0ff
Packit bbb0ff
Use yumdownloader.
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
The methods and their order are defined by BEAKERLIB_RPM_DOWNLOAD_METHODS
Packit bbb0ff
variable as space separated list. By default it is 'direct yum'. This can be
Packit bbb0ff
overridden by user.
Packit bbb0ff
There may be done also additions  or changes to the original value,
Packit bbb0ff
e.g. BEAKERLIB_RPM_DOWNLOAD_METHODS='yum ${BEAKERLIB_RPM_DOWNLOAD_METHODS/yum/}'
Packit bbb0ff
Packit bbb0ff
=head3
Packit bbb0ff
Packit bbb0ff
Beakerlib is prepared for more Koji-based sources of packages while usigng
Packit bbb0ff
direct download method. By default packages are fetched from Koji, particularly
Packit bbb0ff
from https://kojipkgs.fedoraproject.org/packages.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# return information of the first matching package
Packit bbb0ff
# $1 - method (rpm | repoquery)
Packit bbb0ff
# $2 - packages (NVR)
Packit bbb0ff
__INTERNAL_rpmGetPackageInfo() {
Packit bbb0ff
  local package_info package_info_raw res=0
Packit bbb0ff
  rlLogDebug "${FUNCNAME}(): getting package info for '$2'"
Packit bbb0ff
  package_info_raw="$($1 --qf "%{name} %{version} %{release} %{arch} %{sourcerpm}\n" -q "$2")"
Packit bbb0ff
  [[ $? -ne 0 || -z "$package_info_raw" ]] && {
Packit bbb0ff
    rlLogDebug "${FUNCNAME}(): package_info_raw: '$package_info_raw'"
Packit bbb0ff
    rlLogInfo "rpm '$2' not available using '$1' tool"
Packit bbb0ff
    let res++
Packit bbb0ff
  }
Packit bbb0ff
  if [[ $res -eq 0 ]]; then
Packit bbb0ff
    rlLogDebug "${FUNCNAME}(): package_info_raw: '$package_info_raw'"
Packit bbb0ff
    # get first package
Packit bbb0ff
    local tmp=( $(echo "$package_info_raw" | head -n 1 ) )
Packit bbb0ff
    # extract component name from source_rpm
Packit bbb0ff
    package_info="${tmp[@]:0:4} $(__INTERNAL_getNVRA "${tmp[4]/.rpm}")" || {
Packit bbb0ff
      rlLogError "parsing package info '$package_info_raw' failed"
Packit bbb0ff
      let res++
Packit bbb0ff
    }
Packit bbb0ff
    rlLogDebug "${FUNCNAME}(): package_info: '$package_info'"
Packit bbb0ff
    rlLogDebug "got rpm info for '$2' via '$1'"
Packit bbb0ff
    echo "$package_info"
Packit bbb0ff
  fi
Packit bbb0ff
  rlLogDebug "${FUNCNAME}(): returning $res"
Packit bbb0ff
  return $res
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
BEAKERLIB_rpm_fetch_base_url=( "https://kojipkgs.fedoraproject.org/packages" )
Packit bbb0ff
BEAKERLIB_rpm_packageinfo_base_url=( "http://koji.fedoraproject.org/koji" )
Packit bbb0ff
Packit bbb0ff
# generate combinations for various methods and parameters of finding the package
Packit bbb0ff
__INTERNAL_rpmInitUrl() {
Packit bbb0ff
    local i j k
Packit bbb0ff
Packit bbb0ff
    rlLogDebug "${FUNCNAME}(): preparing download variants"
Packit bbb0ff
Packit bbb0ff
    __INTERNAL_rpmGetNextUrl_phase=()
Packit bbb0ff
    for k in rpm repoquery; do
Packit bbb0ff
      for j in nvr n; do
Packit bbb0ff
        for i in "${BEAKERLIB_rpm_fetch_base_url[@]}"; do
Packit bbb0ff
          __INTERNAL_rpmGetNextUrl_phase+=( "$k" ); # tool
Packit bbb0ff
          __INTERNAL_rpmGetNextUrl_phase+=( "$j" ); # package_spec
Packit bbb0ff
          __INTERNAL_rpmGetNextUrl_phase+=( "$i" ); # base_url
Packit bbb0ff
        done
Packit bbb0ff
      done
Packit bbb0ff
    done
Packit bbb0ff
    for j in koji; do
Packit bbb0ff
      for i in "${BEAKERLIB_rpm_packageinfo_base_url[@]}"; do
Packit bbb0ff
        __INTERNAL_rpmGetNextUrl_phase+=( "$j" ) ; # tool
Packit bbb0ff
        __INTERNAL_rpmGetNextUrl_phase+=( "nvra.rpm" )   ; # package_spec
Packit bbb0ff
        __INTERNAL_rpmGetNextUrl_phase+=( "$i" ) ; # base_url
Packit bbb0ff
      done
Packit bbb0ff
    done
Packit bbb0ff
    rlLogDebug "${FUNCNAME}(): $(set | grep ^__INTERNAL_rpmGetNextUrl_phase=)"
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit Service e5f175
__INTERNAL_WGET="wget -t 3 -T 180 -w 20 --waitretry=30 --no-check-certificate --progress=dot:giga"
Packit bbb0ff
Packit bbb0ff
# __INTERNAL_rpmGetNextUrl N V R A | --source N V R
Packit bbb0ff
__INTERNAL_rpmGetNextUrl() {
Packit bbb0ff
    local source=''
Packit bbb0ff
    [[ "$1" == "--source" ]] && {
Packit bbb0ff
        source="$1"
Packit bbb0ff
        shift
Packit bbb0ff
    }
Packit bbb0ff
    local N=$1 V=$2 R=$3 A=$4 nil res url
Packit bbb0ff
    rlLogDebug "${FUNCNAME}(): process $N-$V-$R.$A"
Packit bbb0ff
    while [[ -n "$__INTERNAL_rpmGetNextUrl_phase" ]]; do
Packit bbb0ff
      res=0
Packit bbb0ff
      local tool=${__INTERNAL_rpmGetNextUrl_phase[0]}
Packit bbb0ff
      local package_spec=${__INTERNAL_rpmGetNextUrl_phase[1]}
Packit bbb0ff
      local base_url=${__INTERNAL_rpmGetNextUrl_phase[2]}
Packit bbb0ff
      #rlLogDebug "${FUNCNAME}(): $(set | grep ^__INTERNAL_rpmGetNextUrl_phase=)"
Packit bbb0ff
      rlLogDebug "${FUNCNAME}(): remove first three indices of __INTERNAL_rpmGetNextUrl_phase"
Packit bbb0ff
      __INTERNAL_rpmGetNextUrl_phase=( "${__INTERNAL_rpmGetNextUrl_phase[@]:3}" )
Packit bbb0ff
      rlLogDebug "trying tool $tool with $package_spec"
Packit bbb0ff
      case $tool,$package_spec in
Packit bbb0ff
        *,nvr)
Packit bbb0ff
          IFS=' ' read nil nil nil nil CN CV CR CA < <(__INTERNAL_rpmGetPackageInfo $tool "$N-$V-$R")
Packit bbb0ff
          res=$?
Packit bbb0ff
          if [[ -n "$source" ]]; then
Packit bbb0ff
            url="$base_url/$CN/$CV/$CR/src/$CN-$CV-$CR.src.rpm"
Packit bbb0ff
          else
Packit bbb0ff
            url="$base_url/$CN/$CV/$CR/$A/$N-$V-$R.$A.rpm"
Packit bbb0ff
          fi
Packit bbb0ff
          ;;
Packit bbb0ff
        *,n)
Packit bbb0ff
          IFS=' ' read nil nil nil nil CN CV CR CA < <(__INTERNAL_rpmGetPackageInfo $tool "$N")
Packit bbb0ff
          res=$?
Packit bbb0ff
          if [[ -n "$source" ]]; then
Packit bbb0ff
            url="$base_url/$CN/$V/$R/src/$CN-$V-$R.src.rpm"
Packit bbb0ff
          else
Packit bbb0ff
            url="$base_url/$CN/$V/$R/$A/$N-$V-$R.$A.rpm"
Packit bbb0ff
          fi
Packit bbb0ff
          ;;
Packit bbb0ff
        koji,nvra.rpm)
Packit bbb0ff
          rlLogDebug "$FUNCNAME(): get rpm info"
Packit Service e5f175
          local rpm_info=$($__INTERNAL_WGET -O - "$base_url/search?match=exact&type=rpm&terms=$N-$V-$R.$A.rpm")
Packit bbb0ff
          [[ $? -ne 0 || -z "$rpm_info" ]] && {
Packit bbb0ff
            rlLogError "could not download rpm information"
Packit bbb0ff
            let res++
Packit bbb0ff
            continue
Packit bbb0ff
          }
Packit bbb0ff
          #[[ "$DEBUG" ]] && rlLogDebug "rpm_info='$rpm_info'"
Packit bbb0ff
          local buildurl=$(echo "$rpm_info" | grep Version | grep -o '[^"]*buildID=[^"]*')
Packit bbb0ff
          [[ $? -ne 0 || -z "$buildurl" ]] && {
Packit bbb0ff
            rlLogError "could not find buildID"
Packit bbb0ff
            let res++
Packit bbb0ff
            continue
Packit bbb0ff
          }
Packit bbb0ff
          rlLogDebug "$FUNCNAME(): extracted buildurl='$buildurl'"
Packit bbb0ff
          [[ "$buildurl" =~ http ]] || buildurl="$base_url/$buildurl"
Packit bbb0ff
          rlLogDebug "$FUNCNAME(): using buildurl='$buildurl'"
Packit Service e5f175
          local buildinfo=$($__INTERNAL_WGET -O - "$buildurl")
Packit bbb0ff
          [[ $? -ne 0 || -z "$buildinfo" ]] && {
Packit bbb0ff
            rlLogError "could not download build information"
Packit bbb0ff
            let res++
Packit bbb0ff
            continue
Packit bbb0ff
          }
Packit bbb0ff
          #[[ -n "$DEBUG" ]] && rlLogDebug "buildinfo='$buildinfo'"
Packit bbb0ff
          if [[ -n "$source" ]]; then
Packit bbb0ff
            url=$(echo "$buildinfo" | grep download | grep -o 'http[^"]*.src.rpm')
Packit bbb0ff
          else
Packit bbb0ff
            url=$(echo "$buildinfo" | grep download | grep -o "http[^\"]*/$N-$V-$R.$A.rpm")
Packit bbb0ff
          fi
Packit bbb0ff
          [[ $? -ne 0 ]] && {
Packit bbb0ff
            rlLogError "could not find package url"
Packit bbb0ff
            let res++
Packit bbb0ff
            continue
Packit bbb0ff
          }
Packit bbb0ff
          ;;
Packit bbb0ff
        *)
Packit bbb0ff
          rlLogDebug "$FUNCNAME(): unknown case"
Packit bbb0ff
          rlLogError "there's a bug in the code, unknown case!"
Packit bbb0ff
          let res++
Packit bbb0ff
          break
Packit bbb0ff
      esac
Packit bbb0ff
      [[ $res -eq 0 ]] && break
Packit bbb0ff
    done
Packit bbb0ff
Packit bbb0ff
    [[ -z "$url" ]] && {
Packit bbb0ff
      rlLogError "could not find package url"
Packit bbb0ff
      let res++
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    rlLogDebug "$FUNCNAME(): using url='$url'"
Packit bbb0ff
Packit bbb0ff
    [[ $res -eq 0 ]] && __INTERNAL_RETURN_VALUE="$url"
Packit bbb0ff
Packit bbb0ff
    rlLogDebug "${FUNCNAME}(): returning $res"
Packit bbb0ff
    return $res
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
__INTERNAL_getNVRA() {
Packit bbb0ff
    rlLogDebug "${FUNCNAME}(): parsing NVRA for '$1'"
Packit bbb0ff
    local pat='(.+)-([^-]+)-(.+)\.([^.]+)$'
Packit bbb0ff
    [[ "$1" =~ $pat ]] && echo "${BASH_REMATCH[@]:1}"
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
__INTERNAL_rpmDirectDownload() {
Packit bbb0ff
    local url pkg quiet=''
Packit bbb0ff
    [[ "$1" == "--quiet" ]] && {
Packit bbb0ff
      quiet="$1"
Packit bbb0ff
      shift
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    __INTERNAL_rpmInitUrl
Packit bbb0ff
    while __INTERNAL_rpmGetNextUrl "$@"; do
Packit bbb0ff
        url="$__INTERNAL_RETURN_VALUE"; unset __INTERNAL_RETURN_VALUE
Packit bbb0ff
        local pkg=$(basename "$url")
Packit bbb0ff
        rlLog "trying download from '$url'"
Packit Service e5f175
        if $__INTERNAL_WGET $quiet -O $pkg "$url"; then
Packit bbb0ff
            rlLogDebug "$FUNCNAME(): package '$pkg' was successfully downloaded"
Packit bbb0ff
            echo "$pkg"
Packit bbb0ff
            return 0
Packit bbb0ff
        fi
Packit bbb0ff
        rm -f "$pkg"
Packit bbb0ff
        rlLogWarning "package '$pkg' was not successfully downloaded"
Packit bbb0ff
    done
Packit bbb0ff
    rlLogError "package '$pkg' was not successfully downloaded"
Packit bbb0ff
    rlLogDebug "${FUNCNAME}(): returning 1"
Packit bbb0ff
    return 1
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# __INTERNAL_rpmGetWithYumDownloader
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
#
Packit bbb0ff
#  Download package using yumdownloader
Packit bbb0ff
Packit bbb0ff
__INTERNAL_rpmGetWithYumDownloader() {
Packit bbb0ff
    local source='' quiet=''
Packit bbb0ff
    while [[ "${1:0:2}" == "--" ]]; do
Packit bbb0ff
      case $1 in
Packit bbb0ff
        --quiet)
Packit bbb0ff
          quiet="$1"
Packit bbb0ff
        ;;
Packit bbb0ff
        --source)
Packit bbb0ff
          source="$1"
Packit bbb0ff
        ;;
Packit bbb0ff
      esac
Packit bbb0ff
      shift
Packit bbb0ff
    done
Packit bbb0ff
Packit bbb0ff
    local package="$1-$2-$3.$4"
Packit bbb0ff
    [[ -n "$source" ]] && package="$1-$2-$3"
Packit bbb0ff
    rlLogDebug "${FUNCNAME}(): Trying yumdownloader to download $package"
Packit bbb0ff
    if ! which yumdownloader &> /dev/null ; then
Packit bbb0ff
        rlLogInfo "yumdownloader not installed: attempting to install yum-utils"
Packit bbb0ff
        yum install $quiet -y yum-utils >&2
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    if ! which yumdownloader &> /dev/null ; then
Packit bbb0ff
        rlLogError "yumdownloader not installed even after instalation attempt"
Packit bbb0ff
        return 1
Packit bbb0ff
    else
Packit bbb0ff
        local tmp
Packit bbb0ff
        if tmp=$(mktemp -d); then
Packit bbb0ff
            rlLogDebug "$FUNCNAME(): downloading package to tmp dir '$tmp'"
Packit bbb0ff
            ( cd $tmp; yumdownloader $quiet -y $source $package >&2 ) || {
Packit bbb0ff
                rlLogError "yum downloader failed"
Packit bbb0ff
                rm -rf $tmp
Packit bbb0ff
                return 1
Packit bbb0ff
            }
Packit bbb0ff
            local pkg=$( ls -1 $tmp )
Packit bbb0ff
            rlLogDebug "$FUNCNAME(): got '$pkg'"
Packit bbb0ff
            local pkg_cnt=$( echo "$pkg" | wc -w )
Packit bbb0ff
            rlLogDebug "$FUNCNAME(): pkg_cnt=$pkg_cnt"
Packit bbb0ff
            [[ $pkg_cnt -eq 0 ]] && {
Packit bbb0ff
                rlLogError "did not download anything"
Packit bbb0ff
                rm -rf $tmp
Packit bbb0ff
                return 1
Packit bbb0ff
            }
Packit bbb0ff
            [[ $pkg_cnt -gt 1 ]] && rlLogWarning "got more than one package"
Packit bbb0ff
            rm -f $pkg
Packit bbb0ff
            rlLogDebug "$FUNCNAME(): moving package to local dir"
Packit bbb0ff
            mv $tmp/* ./
Packit bbb0ff
            rlLogDebug "$FUNCNAME(): removing tmp dir '$tmp'"
Packit bbb0ff
            rm -rf $tmp
Packit bbb0ff
            rlLogDebug "$FUNCNAME(): Download with yumdownloader successful"
Packit bbb0ff
            echo "$pkg"
Packit bbb0ff
            return 0
Packit bbb0ff
        else
Packit bbb0ff
            rlLogError "could not create tmp dir"
Packit bbb0ff
            return 1
Packit bbb0ff
        fi
Packit bbb0ff
    fi
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# magic to allow this:
Packit bbb0ff
# BEAKERLIB_RPM_DOWNLOAD_METHODS="yum ${BEAKERLIB_RPM_DOWNLOAD_METHODS/yum/}"
Packit bbb0ff
__INTERNAL_BEAKERLIB_RPM_DOWNLOAD_METHODS_default='direct yum'
Packit bbb0ff
__INTERNAL_BEAKERLIB_RPM_DOWNLOAD_METHODS_cmd="BEAKERLIB_RPM_DOWNLOAD_METHODS=\"${BEAKERLIB_RPM_DOWNLOAD_METHODS:-$__INTERNAL_BEAKERLIB_RPM_DOWNLOAD_METHODS_default}\""
Packit bbb0ff
BEAKERLIB_RPM_DOWNLOAD_METHODS=$__INTERNAL_BEAKERLIB_RPM_DOWNLOAD_METHODS_default
Packit bbb0ff
eval "$__INTERNAL_BEAKERLIB_RPM_DOWNLOAD_METHODS_cmd"
Packit bbb0ff
unset __INTERNAL_BEAKERLIB_RPM_DOWNLOAD_METHODS_cmd
Packit bbb0ff
Packit bbb0ff
__INTERNAL_rpmDownload() {
Packit bbb0ff
    local method rpm res
Packit bbb0ff
Packit bbb0ff
    rlLogDebug "$FUNCNAME(): trying $* with methods '$BEAKERLIB_RPM_DOWNLOAD_METHODS'"
Packit bbb0ff
Packit bbb0ff
    for method in $BEAKERLIB_RPM_DOWNLOAD_METHODS; do
Packit bbb0ff
        rlLogDebug "trying to get the package using method '$method'"
Packit bbb0ff
        case $method in
Packit bbb0ff
            direct)
Packit bbb0ff
                if rpm="$(__INTERNAL_rpmDirectDownload "$@")"; then
Packit bbb0ff
                    res=0
Packit bbb0ff
                    break
Packit bbb0ff
                else
Packit bbb0ff
                    rlLogWarning "could not get package unsing method '$method'"
Packit bbb0ff
                    let res++
Packit bbb0ff
                fi
Packit bbb0ff
            ;;
Packit bbb0ff
            yum)
Packit bbb0ff
                if rpm="$(__INTERNAL_rpmGetWithYumDownloader "$@")"; then
Packit bbb0ff
                    res=0
Packit bbb0ff
                    break
Packit bbb0ff
                else
Packit bbb0ff
                    rlLogWarning "could not get package unsing method '$method'"
Packit bbb0ff
                    let res++
Packit bbb0ff
                fi
Packit bbb0ff
            ;;
Packit bbb0ff
            *)
Packit bbb0ff
                rlLogError "invalid fetch method '$method'"
Packit bbb0ff
                return 1
Packit bbb0ff
            ;;
Packit bbb0ff
        esac
Packit bbb0ff
    done
Packit bbb0ff
    [[ $res -eq 0 ]] && echo "$rpm"
Packit bbb0ff
    rlLogDebug "$FUNCNAME(): returning $res"
Packit bbb0ff
    return $res
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlRpmInstall
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<=cut
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlRpmInstall
Packit bbb0ff
Packit bbb0ff
Try to install specified package from local Red Hat sources.
Packit bbb0ff
Packit bbb0ff
    rlRpmInstall [--quiet] package version release arch
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item --quiet
Packit bbb0ff
Packit bbb0ff
Make the download and the install process be quiet.
Packit bbb0ff
Packit bbb0ff
=item package
Packit bbb0ff
Packit bbb0ff
Package name like C<kernel>
Packit bbb0ff
Packit bbb0ff
=item version
Packit bbb0ff
Packit bbb0ff
Package version like C<2.6.25.6>
Packit bbb0ff
Packit bbb0ff
=item release
Packit bbb0ff
Packit bbb0ff
Package release like C<55.fc9>
Packit bbb0ff
Packit bbb0ff
=item arch
Packit bbb0ff
Packit bbb0ff
Package arch like C<i386>
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
Returns 0 if specified package was installed succesfully.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
rlRpmInstall(){
Packit bbb0ff
    local quiet=''
Packit bbb0ff
    [[ "$1" == "--quiet" ]] && {
Packit bbb0ff
      quiet="$1"
Packit bbb0ff
      shift
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    if [ $# -ne 4 ]; then
Packit bbb0ff
        rlLogError "Missing parameter(s)"
Packit bbb0ff
        return 1
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    local N=$1;
Packit bbb0ff
    local V=$2;
Packit bbb0ff
    local R=$3;
Packit bbb0ff
    local A=$4;
Packit bbb0ff
    rlLog "Installing RPM $N-$V-$R.$A"
Packit bbb0ff
Packit bbb0ff
    if rlCheckRpm $N $V $R $A; then
Packit bbb0ff
        rlLog "$FUNCNAME: $N-$V-$R.$A already present. Doing nothing"
Packit bbb0ff
        return 0
Packit bbb0ff
    else
Packit bbb0ff
        local tmp=$(mktemp -d)
Packit bbb0ff
        ( cd $tmp; __INTERNAL_rpmDownload $quiet $N $V $R $A )
Packit bbb0ff
        if [ $? -eq 0 ]; then
Packit bbb0ff
            rlLog "RPM: $N-$V-$R.$A.rpm"
Packit bbb0ff
            if [[ -z "$quiet" ]]; then
Packit bbb0ff
              rpm -Uhv --oldpackage "$tmp/$N-$V-$R.$A.rpm"
Packit bbb0ff
            else
Packit bbb0ff
              rpm -Uq --oldpackage "$tmp/$N-$V-$R.$A.rpm"
Packit bbb0ff
            fi
Packit bbb0ff
            local ECODE=$?
Packit bbb0ff
            if [ $ECODE -eq 0 ] ; then
Packit bbb0ff
                rlLogInfo "$FUNCNAME: RPM installed successfully"
Packit bbb0ff
            else
Packit bbb0ff
                rlLogError "$FUNCNAME: RPM installation failed"
Packit bbb0ff
            fi
Packit bbb0ff
            rm -rf "$tmp"
Packit bbb0ff
            return $ECODE
Packit bbb0ff
        else
Packit bbb0ff
           rlLogError "$FUNCNAME: RPM not found"
Packit bbb0ff
        fi
Packit bbb0ff
        return 1
Packit bbb0ff
    fi
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlRpmDownload
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<=cut
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlRpmDownload
Packit bbb0ff
Packit bbb0ff
Try to download specified package.
Packit bbb0ff
Packit bbb0ff
    rlRpmDownload [--quiet] {package version release arch|N-V-R.A}
Packit bbb0ff
    rlRpmDownload [--quiet] --source {package version release|N-V-R}
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item --quiet
Packit bbb0ff
Packit bbb0ff
Make the download process be quiet.
Packit bbb0ff
Packit bbb0ff
=item package
Packit bbb0ff
Packit bbb0ff
Package name like C<kernel>
Packit bbb0ff
Packit bbb0ff
=item version
Packit bbb0ff
Packit bbb0ff
Package version like C<2.6.25.6>
Packit bbb0ff
Packit bbb0ff
=item release
Packit bbb0ff
Packit bbb0ff
Package release like C<55.fc9>
Packit bbb0ff
Packit bbb0ff
=item arch
Packit bbb0ff
Packit bbb0ff
Package arch like C<i386>
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
Returns 0 if specified package was downloaded succesfully.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
rlRpmDownload(){
Packit bbb0ff
    local source='' res pkg N V R A quiet=''
Packit bbb0ff
    while [[ "${1:0:2}" == "--" ]]; do
Packit bbb0ff
      case $1 in
Packit bbb0ff
        --quiet)
Packit bbb0ff
          quiet="$1"
Packit bbb0ff
        ;;
Packit bbb0ff
        --source)
Packit bbb0ff
          source="$1"
Packit bbb0ff
        ;;
Packit bbb0ff
      esac
Packit bbb0ff
      shift
Packit bbb0ff
    done
Packit bbb0ff
Packit bbb0ff
    if [[ $# -eq 1 ]]; then
Packit bbb0ff
        local package="$1"
Packit bbb0ff
        [[ -n "$source" ]] && package="$package.src"
Packit bbb0ff
        if ! IFS=' ' read N V R A < <(__INTERNAL_getNVRA "$package"); then
Packit bbb0ff
            rlLogError "$FUNCNAME: Bad N.V.R-A format"
Packit bbb0ff
            return 1
Packit bbb0ff
        fi
Packit bbb0ff
    elif [[ -z "$source" && $# -eq 4 ]]; then
Packit bbb0ff
        N="$1"
Packit bbb0ff
        V="$2"
Packit bbb0ff
        R="$3"
Packit bbb0ff
        A="$4"
Packit bbb0ff
    elif [[ -n "$source" && $# -ge 3 ]]; then
Packit bbb0ff
        N="$1"
Packit bbb0ff
        V="$2"
Packit bbb0ff
        R="$3"
Packit bbb0ff
        A=""
Packit bbb0ff
    else
Packit bbb0ff
        rlLogError "$FUNCNAME: invalid parameter(s)"
Packit bbb0ff
        return 1
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    rlLog "$FUNCNAME: Fetching ${source:+source }RPM $N-$V-$R.$A"
Packit bbb0ff
Packit bbb0ff
    if pkg=$(__INTERNAL_rpmDownload $quiet $source $N $V $R $A); then
Packit bbb0ff
        rlLog "RPM: $pkg"
Packit bbb0ff
        echo "$pkg"
Packit bbb0ff
        return 0
Packit bbb0ff
    else
Packit bbb0ff
        rlLogError "$FUNCNAME: RPM download failed"
Packit bbb0ff
        return 1
Packit bbb0ff
    fi
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlFetchSrcForInstalled
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<=cut
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlFetchSrcForInstalled
Packit bbb0ff
Packit bbb0ff
Tries various ways to download source rpm for specified installed rpm.
Packit bbb0ff
Packit bbb0ff
    rlFetchSrcForInstalled [--quiet] package
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item --quiet
Packit bbb0ff
Packit bbb0ff
Make the download process be quiet.
Packit bbb0ff
Packit bbb0ff
=item package
Packit bbb0ff
Packit bbb0ff
Installed package name like C<kernel>. It accepts in-direct names.
Packit bbb0ff
Eg for the package name C<krb5-libs> will the function download
Packit bbb0ff
the C<krb5> source rpm.
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
Returns 0 if the source package was succesfully downloaded.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
rlFetchSrcForInstalled(){
Packit bbb0ff
    local quiet=''
Packit bbb0ff
    [[ "$1" == "--quiet" ]] && {
Packit bbb0ff
      quiet="$1"
Packit bbb0ff
      shift
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    local PKGNAME=$1 srcrpm
Packit bbb0ff
    local N V R nil
Packit bbb0ff
Packit bbb0ff
    if ! IFS=' ' read N V R nil < <((__INTERNAL_rpmGetPackageInfo rpm "$PKGNAME")); then
Packit bbb0ff
        rlLogError "$FUNCNAME: The package is not installed, can't download the source"
Packit bbb0ff
        return 1
Packit bbb0ff
    fi
Packit bbb0ff
    rlLog "$FUNCNAME: Fetching source rpm for installed $N-$V-$R"
Packit bbb0ff
Packit bbb0ff
    if srcrpm="$(__INTERNAL_rpmDownload $quiet --source $N $V $R)"; then
Packit bbb0ff
        echo "$srcrpm"
Packit bbb0ff
        return 0
Packit bbb0ff
    else
Packit bbb0ff
        rlLogError "$FUNCNAME: could not get package"
Packit bbb0ff
        return 1
Packit bbb0ff
    fi
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# AUTHORS
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head1 AUTHORS
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Petr Muller <pmuller@redhat.com>
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Jan Hutar <jhutar@redhat.com>
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Petr Splichal <psplicha@redhat.com>
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Ales Zelinka <azelinka@redhat.com>
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Dalibor Pospisil <dapospis@redhat.com>
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
=cut