#!/bin/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. #set -x usage() { printf "Usage: %s [vhd file in secondary storage] [template directory in secondary storage] \n" $(basename $0) } cleanup() { if [ ! -z $snapshotdir ]; then umount $snapshotdir if [ $? -eq 0 ]; then rmdir $snapshotdir fi fi if [ ! -z $templatedir ]; then umount $templatedir if [ $? -eq 0 ]; then rmdir $templatedir fi fi } if [ -z $1 ]; then usage echo "2#no vhd file path" exit 0 else snapshoturl=${1%/*} vhdfilename=${1##*/} fi if [ -z $2 ]; then usage echo "3#no template path" exit 0 else templateurl=$2 fi snapshotdir=/var/run/cloud_mount/$(uuidgen -r) mkdir -p $snapshotdir if [ $? -ne 0 ]; then echo "4#can't make dir $snapshotdir" exit 0 fi mount -o tcp $snapshoturl $snapshotdir if [ $? -ne 0 ]; then rmdir $snapshotdir echo "5#can not mount $snapshoturl to $snapshotdir" exit 0 fi templatedir=/var/run/cloud_mount/$(uuidgen -r) mkdir -p $templatedir if [ $? -ne 0 ]; then templatedir="" cleanup echo "6#can't make dir $templatedir" exit 0 fi mount -o tcp $templateurl $templatedir if [ $? -ne 0 ]; then rmdir $templatedir templatedir="" cleanup echo "7#can not mount $templateurl to $templatedir" exit 0 fi VHDUTIL="/opt/cloud/bin/vhd-util" upgradeSnapshot() { local ssvhd=$1 local parent=`$VHDUTIL query -p -n $ssvhd` if [ $? -ne 0 ]; then echo "30#failed to query $ssvhd" cleanup exit 0 fi if [ "${parent##*vhd has}" = " no parent" ]; then dd if=$templatevhd of=$snapshotdir/$templatefilename bs=2M if [ $? -ne 0 ]; then echo "31#failed to dd $templatevhd to $snapshotdir/$templatefilenamed" cleanup exit 0 fi $VHDUTIL modify -p $snapshotdir/$templatefilename -n $ssvhd if [ $? -ne 0 ]; then echo "32#failed to set parent of $ssvhd to $snapshotdir/$templatefilenamed" cleanup exit 0 fi rm -f $parent else upgradeSnapshot $parent fi } templatevhd=$(ls $templatedir/*.vhd) if [ $? -ne 0 ]; then echo "8#template vhd doesn't exist for $templateurl" cleanup exit 0 fi templatefilename=${templatevhd##*/} snapshotvhd=$snapshotdir/$vhdfilename upgradeSnapshot $snapshotvhd cleanup echo "0#success" exit 0