#!/bin/bash # Copyright 2012 Hewlett-Packard Development Company, L.P. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. if [ ${DIB_DEBUG_TRACE:-0} -gt 1 ]; then set -x fi set -eu set -o pipefail EXTRA_ARGS= ACTION=install MAP_ELEMENT= # allow override for dnf, as shipped by default with >=F22 YUM=${YUM:-yum} # save global xtrace state _xtrace=$(set +o | grep xtrace) SCRIPTNAME=$(basename $0) function show_options () { echo "Usage: $SCRIPTNAME [package ...]" echo echo "Options:" echo " -u -- update all packages" echo " -d dir -- download the packages to directory" echo " -e -- erase/remove packages" echo " -m map -- use custom element package map (Example: -m nova)" exit 0 } while getopts "hud:em:" opt; do case "$opt" in u) ${YUM} -y update; exit 0 ;; d) ACTION="download" DOWNLOAD_PATH=$OPTARG ;; e) ACTION="remove" ;; m) MAP_ELEMENT=$OPTARG ;; h) show_options ;; *) exit 1 ;; esac done shift $((OPTIND-1)) # Packages that aren't available in the distro but requested for installation # can be ignored by adding them to the exclude list BLACKLIST=$(cat /tmp/yum-blacklist 2>/dev/null || echo "") WHITELIST="" for i in "$@" do PKG_NAME=$i if [ -n "$MAP_ELEMENT" ]; then if ! PKG_NAME=$(pkg-map --element $MAP_ELEMENT $i); then echo "bin/pkg-map error. $PKG_NAME" exit 1 fi fi if [[ ! ${BLACKLIST[*]} =~ $PKG_NAME ]]; then WHITELIST="$WHITELIST $i" else echo "The package $i is not available and will not be installed" fi done if [ -n "$WHITELIST" ]; then if [ -f /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release ]; then rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release fi if [ -n "$MAP_ELEMENT" ]; then if ! PKGS=$(pkg-map --element $MAP_ELEMENT $WHITELIST); then echo "bin/pkg-map error. $PKGS" exit 1 fi else PKGS=$(map-packages $WHITELIST) fi if [ -z "${PKGS}" ]; then echo "Not running install-packages $ACTION with empty packages list" exit 0 fi echo "Running install-packages ${ACTION}." if [ "$ACTION" == "download" ]; then mkdir -p $DOWNLOAD_PATH if [ ${YUM} == "dnf" ]; then dnf download --destdir=$DOWNLOAD_PATH $PKGS else # note; you don't want to use yum --download only here. # Firstly that only puts things in the yum cache # directory, and secondly it acts funny if old versions # are already in the cache. if [ ! -f /usr/bin/yumdownloader ]; then yum install -y yum-utils fi yumdownloader --destdir=$DOWNLOAD_PATH $PKGS fi exit 0 fi # yum & dnf have a feature/bug where missing packages in a list of # packages for install/erase do not raise an error exit [1]. # There is a corner case when specifying just *one* package, where # it will fail if the package is missing. Thus install-packages # follows this behaviour; we may need to re-evaluate this at some # point. # # [1] https://bugzilla.redhat.com/show_bug.cgi?id=965567 set -o xtrace if [[ -n ${DIB_YUM_DNF_CONTENTDIR:-''} ]]; then echo $DIB_YUM_DNF_CONTENTDIR | sudo tee /etc/dnf/vars/contentdir sudo sed -i -e 's,^mirrorlist,#mirrorlist,' -e 's,^#baseurl,baseurl,' /etc/yum.repos.d/*.repo fi ${YUM} -v -y $ACTION $EXTRA_ARGS $PKGS if [ "$ACTION" == "install" ]; then if [ ${YUM} == "dnf" ]; then # Make sure dnf won't autoremove these packages dnf mark install $PKGS fi fi $_xtrace # probably not the right place for this; but python-pip package on # fedora/rh calls pip "pip-python" while the rest of the work # expects it to be just called "pip" for pkg in "$@"; do if [ "$pkg" = "python-pip" ] ; then alternatives --install /usr/bin/pip pip /usr/bin/pip-python 10 fi done fi