diff --git a/elements/opensuse/bin/install-packages b/elements/opensuse/bin/install-packages index f59d502f..6af794be 100755 --- a/elements/opensuse/bin/install-packages +++ b/elements/opensuse/bin/install-packages @@ -17,31 +17,65 @@ set -eu set -o pipefail +EXTRA_ARGS="" +MAP_ELEMENT="" + +SCRIPTNAME=$(basename $0) +function show_options () { + echo "Usage: $SCRIPTNAME [package ...]" + echo + echo "Options:" + echo " -u -- update all packages" + echo " -d -- download the packages only" + echo " -m -- use custom element package map (Example: -m nova)" + exit 0 +} + function run_zypper() { # TODO: Uncertain if this can ever block wanting input from user zypper --non-interactive --gpg-auto-import-keys "$@" } -if [ "$1" = "-u" ] ; then - run_zypper dist-upgrade - exit 0 -elif [ "$1" = "-d" ] ; then - EXTRA_ARGS="--download-only" - shift -fi +TEMP=$(getopt -o hudem: -n $SCRIPTNAME -- "$@") +if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi +eval set -- "$TEMP" + +while true ; do + case "$1" in + -u) run_zypper dist-upgrade; exit 0;; + -d) EXTRA_ARGS="--download-only"; shift;; + -m) MAP_ELEMENT=$2; shift 2;; + -h) show_options;; + --) shift; break ;; + *) echo "Error: unsupported option $1."; exit 1;; + esac +done # Packages that aren't available in the distro but requested for installation # can be ignored by adding them to the exclude list BLACKLIST=(dkms) -WHITELIST=() +WHITELIST="" for i in "$@" do - if [[ ! ${BLACKLIST[*]} =~ $i ]]; then + PKG_NAME=$i + if [ -n "$MAP_ELEMENT" ]; then + PKG_NAME=$(pkg-map --element $MAP_ELEMENT $i) + fi + if [[ ! ${BLACKLIST[*]} =~ $PKG_NAME ]]; then WHITELIST+="$i " else echo "The package $i is not available and will not be installed" fi done + if [ -n "$WHITELIST" ]; then - run_zypper install $EXTRA_ARGS $(map-packages $WHITELIST) + 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 + run_zypper install $EXTRA_ARGS $PKGS fi