#!/usr/bin/env bash # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you 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. # $Id: createtmplt.sh 11601 2010-08-11 17:26:15Z kris $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.refactor/java/scripts/storage/qcow2/createtmplt.sh $ # createtmplt.sh -- install a template usage() { printf "Usage: %s: -t -n -f -s -c -d -h [-u]\n" $(basename $0) >&2 } #set -x qemu_img="cloud-qemu-img" which $qemu_img >& /dev/null if [ $? -gt 0 ] then which qemu-img >& /dev/null if [ $? -eq 0 ] then qemu_img="qemu-img" fi fi untar() { local ft=$(file $1| awk -F" " '{print $2}') local basedir=$(dirname $1) case $ft in USTAR) local rootimg=$(tar tf $1 | grep $3) (cd $2; tar xf $1) rm -f $1 printf "$2/$rootimg" ;; *) printf "$1" return 0 ;; esac } uncompress() { local ft=$(file $1| awk -F" " '{print $2}') local imgfile=${1%.*} #strip out trailing file suffix local tmpfile=${imgfile}.tmp case $ft in gzip) gunzip -c $1 > $tmpfile ;; bzip2) bunzip2 -c $1 > $tmpfile ;; [zZ][iI][pP]) unzip -p $1 | cat > $tmpfile ;; *) printf "$1" return 0 ;; esac if [ $? -gt 0 ] then printf "Failed to uncompress file, exiting " exit 1 fi mv $tmpfile $imgfile printf "$imgfile" return 0 } create_from_file() { local tmpltfs=$1 local tmpltimg="$2" local tmpltname=$3 if [ -b $tmpltimg ]; then $qemu_img convert -f raw -O qcow2 "$tmpltimg" /$tmpltfs/$tmpltname else # if backing image exists, we need to combine them, otherwise # copy the image to preserve snapshots/compression if $qemu_img info "$tmpltimg" | grep -q backing; then $qemu_img convert -f qcow2 -O qcow2 "$tmpltimg" /$tmpltfs/$tmpltname >& /dev/null else cp -f $tmpltimg /$tmpltfs/$tmpltname fi fi if [ "$cleanup" == "true" ] then rm -f "$tmpltimg" fi chmod a+r /$tmpltfs/$tmpltname } create_from_snapshot() { local tmpltImg="$1" local snapshotName="$2" local tmpltfs=$3 local tmpltname=$4 $qemu_img convert -f qcow2 -O qcow2 -s "$snapshotName" "$tmpltImg" /$tmpltfs/$tmpltname >& /dev/null if [ $? -gt 0 ] then printf "Failed to create template /$tmpltfs/$tmpltname from snapshot $snapshotName on disk $tmpltImg " exit 2 fi chmod a+r /$tmpltfs/$tmpltname } tflag= nflag= fflag= sflag= hflag= hvm=false cleanup=false dflag= cflag= snapshotName= while getopts 'uht:n:f:sc:d:' OPTION do case $OPTION in t) tflag=1 tmpltfs="$OPTARG" ;; n) nflag=1 tmpltname="$OPTARG" ;; f) fflag=1 tmpltimg="$OPTARG" ;; s) sflag=1 ;; c) cflag=1 snapshotName="$OPTARG" ;; d) dflag=1 descr="$OPTARG" ;; u) cleanup="true" ;; ?) usage exit 2 ;; esac done if [ ! -d /$tmpltfs ] then mkdir -p /$tmpltfs if [ $? -gt 0 ] then printf "Failed to create user fs $tmpltfs\n" >&2 exit 1 fi fi if [ ! -f $tmpltimg -a ! -b $tmpltimg ] then printf "root disk file $tmpltimg doesn't exist\n" exit 3 fi tmpltimg=$(uncompress "$tmpltimg") if [ $? -ne 0 ] then printf "failed to uncompress $tmpltimg\n" fi if [ "$sflag" == "1" ] then create_from_snapshot "$tmpltimg" "$snapshotName" $tmpltfs $tmpltname else create_from_file $tmpltfs "$tmpltimg" $tmpltname fi touch /$tmpltfs/template.properties chmod a+r /$tmpltfs/template.properties echo -n "" > /$tmpltfs/template.properties today=$(date '+%m_%d_%Y') echo "filename=$tmpltname" > /$tmpltfs/template.properties echo "snapshot.name=$today" >> /$tmpltfs/template.properties echo "description=$descr" >> /$tmpltfs/template.properties if [ "$cleanup" == "true" ] then rm -f "$tmpltimg" fi exit 0