#!/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 0 ]; 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} 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="erase" ;; 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}. Package list: $PKGS" 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} -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 # 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