#!/bin/bash # # imgreg.sh # Shellscript for SCS-compliant image registration # on OpenStack clouds. # (c) Kurt Garloff , 2018 -- 2022 # SPDX-License-Identifier: Apache-2.0 #set -x if test -z "$1"; then echo "Usage imgreg.sh [options] file"; exit 1; fi export LC_ALL=en_US #defaults if test "$1" == "--otc"; then shift; OTC=1; fi if test "$1" == "--raw"; then shift; RAW=1; fi MIN_RAM=512 MIN_DISK=4 ARCH=x86_64 IMG=$1 IMGNM=$(basename "$1") IMGFMT="${IMGNM##*.}" OS_DISTRO=${IMGNM%%-*} if test "$OS_DISTRO" == "Ubuntu"; then DEFLT_USER=ubuntu; else DEFLT_USER=linux; fi OS_VER="${IMGNM#*-}" OS_VER="${OS_VER%%-*}" BUILDDT=$(TZ=UTC stat -c %y "$1") BUILDDT="${BUILDDT%%.*}" BUILDDT=${BUILDDT:0:10} IMGINFO=$(qemu-img info "$1") IMGFMT=$(echo "$IMGINFO" | grep '^file format' | sed 's/^file format: //') DISKSZ=$(echo "$IMGINFO" | grep '^virtual size' | sed 's/^[^(]*(\([0-9]*\) bytes).*$/\1/') DISKSZ=$(((DISKSZ+1073741823)/1073741824)) getval() { DESC="$1"; shift echo -n "$DESC [$@]: " 1>&2 read val if test -z "$val"; then echo "$@"; else echo "$val"; fi } OS_DISTRO=$(getval Distro $OS_DISTRO) OS_DIST=$(echo $OS_DISTRO | tr A-Z a-z) OS_VER=$(getval Version $OS_VER) if test "$OS_DIST" = "windows"; then OS_DIST2="${OS_DIST}_${OS_VER%% *}" OS_OS="windows" else OS_DIST2="${OS_DIST}" OS_OS="linux" fi IMAGE_NAME="$OS_DISTRO $OS_VER" IMAGE_NAME=$(getval "Image Name" "$IMAGE_NAME") DISKSZ=$(getval "Min Disk Size" $DISKSZ) MIN_RAM=$(getval "Min RAM" $MIN_RAM) BUILDDT=$(getval "Build Date" "$BUILDDT") ARCH=$(getval "Architecture" $ARCH) DEFLT_USER=$(getval "Default User Name" $DEFLT_USER) if test "$OTC" = "1"; then OS_DIST3=$(echo "${OS_DIST:0:1}" | tr a-z A-Z) OS_DIST3="${OS_DIST3}${OS_DISTRO:1} $OS_VER 64bit" EXTRA="--property __support_kvm=\"true\"" EXTRA="$(getval 'Extra OTC flags' $EXTRA)" EXTRA2="--property __os_version=" EXTRA3="$OS_DIST3" else EXTRA2="--property hw_qemu_guest_agent=" EXTRA3="yes" fi # SCS image spec MGD_BY="managed_by_$LOGNAME" MGD_BY=$(getval "Managed by" "$MGD_BY") RPL_FREQ="never" PROV_UNTIL="$((${BUILDDT:0:4}+1))${BUILDDT:4:10}" UUID_VAL="$PROV_UNTIL" RPL_FREQ=$(getval "Replace Frequency" $RPL_FREQ) PROV_UNTIL=$(getval "Provided until" $PROV_UNTIL) UUID_VAL=$(getval "UUID validity until" $UUID_VAL) IMG_DESC=https://kfg.images.obs-website.eu-de.otc.t-systems.com/ IMG_SRC="${IMG_DESC}${IMG##*/}" if test "$RAW" = 1 -a "$IMGFMT" != "raw"; then qemu-img convert "$IMG" -O raw -S 4k "$IMGNM.raw" if test "$?" = 0; then IMGFMT=raw IMG="$IMGNM.raw" else echo "WARNING: Conversion to RAW image failed" unset RAW fi else unset RAW fi echo "openstack image create --disk-format $IMGFMT --min-disk $DISKSZ --min-ram $MIN_RAM --file \"$IMG\" --property image_build_date=\"$BUILDDT\" --property image_original_user=\"$DEFLT_USER\" --property architecture=\"$ARCH\" --property os_distro=\"$OS_DISTRO\" --property os_version=\"$OS_VER\" --property hw_disk_bus=scsi --property hw_scsi_model=virtio-scsi --property hw_rng_model=virtio --property hw_vif_multiqueue_enabled=true --property image_source=\"$IMG_SRC\" --property image_description=$IMG_DESC --property replace_frequency=$RPL_FREQ --property provided_until=$PROV_UNTIL --property uuid_validity=$UUID_VAL --tag $MGD_BY --tag os:$OS_DIST --tag path:os:$OS_OS:$OS_DIST2 $EXTRA $EXTRA2\"$EXTRA3\" \"$IMAGE_NAME\"" openstack image create --disk-format $IMGFMT --min-disk $DISKSZ --min-ram $MIN_RAM --file "$IMG" --property image_build_date="$BUILDDT" --property image_original_user="$DEFLT_USER" --property architecture="$ARCH" --property os_distro="$OS_DISTRO" --property os_version="$OS_VER" --property hw_disk_bus=scsi --property hw_scsi_model=virtio-scsi --property hw_rng_model=virtio --property hw_vif_multiqueue_enabled=true --property image_source="$IMG_SRC" --property image_description=$IMG_DESC --property replace_frequency=$RPL_FREQ --property provided_until=$PROV_UNTIL --property uuid_validity=$UUID_VAL --tag $MGD_BY --tag os:$OS_DIST --tag path:os:$OS_OS:$OS_DIST2 $EXTRA $EXTRA2"$EXTRA3" "$IMAGE_NAME" if test "$RAW" = 1; then rm "$IMG"; fi